Mercurial > octave
diff src/ov-intx.h @ 7997:2b8952e133c9
implement checked conversions between integers
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Wed, 30 Jul 2008 15:20:13 +0200 |
parents | f336dd8e96d0 |
children | f7f2d867c523 |
line wrap: on
line diff
--- a/src/ov-intx.h Wed Jul 30 14:13:45 2008 -0400 +++ b/src/ov-intx.h Wed Jul 30 15:20:13 2008 +0200 @@ -67,29 +67,51 @@ bool is_integer_type (void) const { return true; } +private: + + template <class _int_matrix> + _int_matrix convert_gripe () const + { + typedef typename _int_matrix::element_type dest_el_type; + typedef OCTAVE_INT_NDARRAY_T::element_type src_el_type; + dest_el_type::clear_trunc_flag (); + _int_matrix retval (matrix); + if (dest_el_type::get_trunc_flag ()) + { + gripe_truncated_conversion (src_el_type::type_name (), + dest_el_type::type_name ()); + dest_el_type::clear_trunc_flag (); + + } + + return retval; + } + +public: + int8NDArray - int8_array_value (void) const { return int8NDArray (matrix); } + int8_array_value (void) const { return convert_gripe<int8NDArray> (); } int16NDArray - int16_array_value (void) const { return int16NDArray (matrix); } + int16_array_value (void) const { return convert_gripe<int16NDArray> (); } int32NDArray - int32_array_value (void) const { return int32NDArray (matrix); } + int32_array_value (void) const { return convert_gripe<int32NDArray> (); } int64NDArray - int64_array_value (void) const { return int64NDArray (matrix); } + int64_array_value (void) const { return convert_gripe<int64NDArray> (); } uint8NDArray - uint8_array_value (void) const { return uint8NDArray (matrix); } + uint8_array_value (void) const { return convert_gripe<uint8NDArray> (); } uint16NDArray - uint16_array_value (void) const { return uint16NDArray (matrix); } + uint16_array_value (void) const { return convert_gripe<uint16NDArray> (); } uint32NDArray - uint32_array_value (void) const { return uint32NDArray (matrix); } + uint32_array_value (void) const { return convert_gripe<uint32NDArray> (); } uint64NDArray - uint64_array_value (void) const { return uint64NDArray (matrix); } + uint64_array_value (void) const { return convert_gripe<uint64NDArray> (); } double double_value (bool = false) const @@ -405,61 +427,83 @@ bool is_integer_type (void) const { return true; } +private: + + template <class _int_scalar> + _int_scalar convert_gripe () const + { + typedef _int_scalar dest_el_type; + typedef OCTAVE_INT_T src_el_type; + dest_el_type::clear_trunc_flag (); + _int_scalar retval (scalar); + if (dest_el_type::get_trunc_flag ()) + { + gripe_truncated_conversion (src_el_type::type_name (), + dest_el_type::type_name ()); + dest_el_type::clear_trunc_flag (); + + } + + return retval; + } + +public: + octave_int8 - int8_scalar_value (void) const { return octave_int8 (scalar); } + int8_scalar_value (void) const { return convert_gripe<octave_int8> (); } octave_int16 - int16_scalar_value (void) const { return octave_int16 (scalar); } + int16_scalar_value (void) const { return convert_gripe<octave_int16> (); } octave_int32 - int32_scalar_value (void) const { return octave_int32 (scalar); } + int32_scalar_value (void) const { return convert_gripe<octave_int32> (); } octave_int64 - int64_scalar_value (void) const { return octave_int64 (scalar); } + int64_scalar_value (void) const { return convert_gripe<octave_int64> (); } octave_uint8 - uint8_scalar_value (void) const { return octave_uint8 (scalar); } + uint8_scalar_value (void) const { return convert_gripe<octave_uint8> (); } octave_uint16 - uint16_scalar_value (void) const { return octave_uint16 (scalar); } + uint16_scalar_value (void) const { return convert_gripe<octave_uint16> (); } octave_uint32 - uint32_scalar_value (void) const { return octave_uint32 (scalar); } + uint32_scalar_value (void) const { return convert_gripe<octave_uint32> (); } octave_uint64 - uint64_scalar_value (void) const { return octave_uint64 (scalar); } + uint64_scalar_value (void) const { return convert_gripe<octave_uint64> (); } int8NDArray int8_array_value (void) const - { return int8NDArray (dim_vector (1, 1), scalar); } + { return int8NDArray (dim_vector (1, 1), int8_scalar_value ()); } int16NDArray int16_array_value (void) const - { return int16NDArray (dim_vector (1, 1), scalar); } + { return int16NDArray (dim_vector (1, 1), int16_scalar_value ()); } int32NDArray int32_array_value (void) const - { return int32NDArray (dim_vector (1, 1), scalar); } + { return int32NDArray (dim_vector (1, 1), int32_scalar_value ()); } int64NDArray int64_array_value (void) const - { return int64NDArray (dim_vector (1, 1), scalar); } + { return int64NDArray (dim_vector (1, 1), int64_scalar_value ()); } uint8NDArray uint8_array_value (void) const - { return uint8NDArray (dim_vector (1, 1), scalar); } + { return uint8NDArray (dim_vector (1, 1), uint8_scalar_value ()); } uint16NDArray uint16_array_value (void) const - { return uint16NDArray (dim_vector (1, 1), scalar); } + { return uint16NDArray (dim_vector (1, 1), uint16_scalar_value ()); } uint32NDArray uint32_array_value (void) const - { return uint32NDArray (dim_vector (1, 1), scalar); } + { return uint32NDArray (dim_vector (1, 1), uint32_scalar_value ()); } uint64NDArray uint64_array_value (void) const - { return uint64NDArray (dim_vector (1, 1), scalar); } + { return uint64NDArray (dim_vector (1, 1), uint64_scalar_value ()); } octave_value resize (const dim_vector& dv, bool fill = false) const {