X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fbindings%2Fpython%2Fbt2%2Fbt2%2Ffield.py;h=fe777c34d664f7a3217aceb8083c35bef9e04efc;hb=8bc207afcf9695b096a0a8e8405f06b6328f069b;hp=4f89d1e43a10ccedcf36c9eff846f9a1f6f09f0e;hpb=9cbe0c595e3bf191fb2eb1b906413b2833611f7a;p=babeltrace.git diff --git a/src/bindings/python/bt2/bt2/field.py b/src/bindings/python/bt2/bt2/field.py index 4f89d1e4..fe777c34 100644 --- a/src/bindings/python/bt2/bt2/field.py +++ b/src/bindings/python/bt2/bt2/field.py @@ -180,6 +180,9 @@ class _NumericFieldConst(_FieldConst): except Exception: return False + def __hash__(self): + return hash(self._value) + def __rmod__(self, other): return self._extract_value(other) % self._value @@ -242,7 +245,10 @@ class _NumericFieldConst(_FieldConst): class _NumericField(_NumericFieldConst, _Field): - pass + def __hash__(self): + # Non const field are not hashable as their value may be modified + # without changing the underlying Python object. + raise TypeError('unhashable type: \'{}\''.format(self._NAME)) class _IntegralFieldConst(_NumericFieldConst, numbers.Integral): @@ -324,7 +330,13 @@ class _IntegerFieldConst(_IntegralFieldConst, _FieldConst): class _IntegerField(_IntegerFieldConst, _IntegralField, _Field): - pass + def _check_range(self, value): + if not (value >= self._lower_bound and value <= self._upper_bound): + raise ValueError( + "Value {} is outside valid range [{}, {}]".format( + value, self._lower_bound, self._upper_bound + ) + ) class _UnsignedIntegerFieldConst(_IntegerFieldConst, _FieldConst): @@ -335,10 +347,7 @@ class _UnsignedIntegerFieldConst(_IntegerFieldConst, _FieldConst): if not isinstance(value, numbers.Integral): raise TypeError('expecting an integral number object') - value = int(value) - utils._check_uint64(value) - - return value + return int(value) @property def _value(self): @@ -350,10 +359,21 @@ class _UnsignedIntegerField(_UnsignedIntegerFieldConst, _IntegerField, _Field): def _set_value(self, value): value = self._value_to_int(value) + + self._check_range(value) + native_bt.field_integer_unsigned_set_value(self._ptr, value) value = property(fset=_set_value) + @property + def _lower_bound(self): + return 0 + + @property + def _upper_bound(self): + return (2 ** self.cls.field_value_range) - 1 + class _SignedIntegerFieldConst(_IntegerFieldConst, _FieldConst): _NAME = 'Const signed integer' @@ -363,10 +383,7 @@ class _SignedIntegerFieldConst(_IntegerFieldConst, _FieldConst): if not isinstance(value, numbers.Integral): raise TypeError('expecting an integral number object') - value = int(value) - utils._check_int64(value) - - return value + return int(value) @property def _value(self): @@ -378,10 +395,21 @@ class _SignedIntegerField(_SignedIntegerFieldConst, _IntegerField, _Field): def _set_value(self, value): value = self._value_to_int(value) + + self._check_range(value) + native_bt.field_integer_signed_set_value(self._ptr, value) value = property(fset=_set_value) + @property + def _lower_bound(self): + return -1 * (2 ** (self.cls.field_value_range - 1)) + + @property + def _upper_bound(self): + return (2 ** (self.cls.field_value_range - 1)) - 1 + class _RealFieldConst(_NumericFieldConst, numbers.Real): _NAME = 'Const real' @@ -393,17 +421,43 @@ class _RealFieldConst(_NumericFieldConst, numbers.Real): return float(value) + +class _SinglePrecisionRealFieldConst(_RealFieldConst): + _NAME = 'Const single-precision real' + @property def _value(self): - return native_bt.field_real_get_value(self._ptr) + return native_bt.field_real_single_precision_get_value(self._ptr) + + +class _DoublePrecisionRealFieldConst(_RealFieldConst): + _NAME = 'Const double-precision real' + + @property + def _value(self): + return native_bt.field_real_double_precision_get_value(self._ptr) class _RealField(_RealFieldConst, _NumericField): _NAME = 'Real' + +class _SinglePrecisionRealField(_SinglePrecisionRealFieldConst, _RealField): + _NAME = 'Single-precision real' + def _set_value(self, value): value = self._value_to_float(value) - native_bt.field_real_set_value(self._ptr, value) + native_bt.field_real_single_precision_set_value(self._ptr, value) + + value = property(fset=_set_value) + + +class _DoublePrecisionRealField(_DoublePrecisionRealFieldConst, _RealField): + _NAME = 'Double-precision real' + + def _set_value(self, value): + value = self._value_to_float(value) + native_bt.field_real_double_precision_set_value(self._ptr, value) value = property(fset=_set_value) @@ -483,6 +537,9 @@ class _StringFieldConst(_FieldConst): def __bool__(self): return bool(self._value) + def __hash__(self): + return hash(self._value) + def _repr(self): return repr(self._value) @@ -513,6 +570,11 @@ class _StringField(_StringFieldConst, _Field): ) return self + def __hash__(self): + # Non const field are not hashable as their value may be modified + # without changing the underlying Python object. + raise TypeError('unhashable type: \'{}\''.format(self._NAME)) + class _ContainerFieldConst(_FieldConst): def __bool__(self): @@ -819,7 +881,11 @@ class _StaticArrayField(_StaticArrayFieldConst, _ArrayField, _Field): def _set_value(self, values): if len(self) != len(values): - raise ValueError('expected length of value and array field to match') + raise ValueError( + 'expected length of value ({}) and array field ({}) to match'.format( + len(values), len(self) + ) + ) for index, value in enumerate(values): if value is not None: @@ -861,17 +927,22 @@ _TYPE_ID_TO_CONST_OBJ = { native_bt.FIELD_CLASS_TYPE_BIT_ARRAY: _BitArrayFieldConst, native_bt.FIELD_CLASS_TYPE_UNSIGNED_INTEGER: _UnsignedIntegerFieldConst, native_bt.FIELD_CLASS_TYPE_SIGNED_INTEGER: _SignedIntegerFieldConst, - native_bt.FIELD_CLASS_TYPE_REAL: _RealFieldConst, + native_bt.FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL: _SinglePrecisionRealFieldConst, + native_bt.FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL: _DoublePrecisionRealFieldConst, native_bt.FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION: _UnsignedEnumerationFieldConst, native_bt.FIELD_CLASS_TYPE_SIGNED_ENUMERATION: _SignedEnumerationFieldConst, native_bt.FIELD_CLASS_TYPE_STRING: _StringFieldConst, native_bt.FIELD_CLASS_TYPE_STRUCTURE: _StructureFieldConst, native_bt.FIELD_CLASS_TYPE_STATIC_ARRAY: _StaticArrayFieldConst, - native_bt.FIELD_CLASS_TYPE_DYNAMIC_ARRAY: _DynamicArrayFieldConst, - native_bt.FIELD_CLASS_TYPE_OPTION: _OptionFieldConst, - native_bt.FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR: _VariantFieldConst, - native_bt.FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR: _VariantFieldConst, - native_bt.FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR: _VariantFieldConst, + native_bt.FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD: _DynamicArrayFieldConst, + native_bt.FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD: _DynamicArrayFieldConst, + native_bt.FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD: _OptionFieldConst, + native_bt.FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD: _OptionFieldConst, + native_bt.FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD: _OptionFieldConst, + native_bt.FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD: _OptionFieldConst, + native_bt.FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD: _VariantFieldConst, + native_bt.FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD: _VariantFieldConst, + native_bt.FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD: _VariantFieldConst, } _TYPE_ID_TO_OBJ = { @@ -879,15 +950,20 @@ _TYPE_ID_TO_OBJ = { 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_SINGLE_PRECISION_REAL: _SinglePrecisionRealField, + native_bt.FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL: _DoublePrecisionRealField, native_bt.FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION: _UnsignedEnumerationField, native_bt.FIELD_CLASS_TYPE_SIGNED_ENUMERATION: _SignedEnumerationField, native_bt.FIELD_CLASS_TYPE_STRING: _StringField, 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, + native_bt.FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD: _DynamicArrayField, + native_bt.FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD: _DynamicArrayField, + native_bt.FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD: _OptionField, + native_bt.FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD: _OptionField, + native_bt.FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD: _OptionField, + native_bt.FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD: _OptionField, + native_bt.FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD: _VariantField, + native_bt.FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD: _VariantField, + native_bt.FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD: _VariantField, }