except Exception:
return False
+ def __hash__(self):
+ return hash(self._value)
+
def __rmod__(self, other):
return self._extract_value(other) % self._value
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):
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):
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):
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'
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):
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'
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)
def __bool__(self):
return bool(self._value)
+ def __hash__(self):
+ return hash(self._value)
+
def _repr(self):
return repr(self._value)
)
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):
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:
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_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,