Mercurial > octave
changeset 25088:56e888cd8298 stable
avoid cast warnings from GCC 8 (bug #53544)
* typecast.cc (reinterpret_int_copy): New template function.
(Ftypecast): Use it for int array casts.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Mon, 02 Apr 2018 17:15:28 -0400 |
parents | 8f1ab6db6709 |
children | 97fc8c87f4ce c1dab27c55af |
files | libinterp/corefcn/typecast.cc |
diffstat | 1 files changed, 30 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/corefcn/typecast.cc Mon Apr 02 11:31:11 2018 -0700 +++ b/libinterp/corefcn/typecast.cc Mon Apr 02 17:15:28 2018 -0400 @@ -82,6 +82,25 @@ return retval; } +template <typename ArrayType> +static ArrayType +reinterpret_int_copy (const void *data, octave_idx_type byte_size, + const dim_vector& old_dims) +{ + typedef typename ArrayType::element_type T; + typedef typename T::val_type VT; + octave_idx_type n = byte_size / sizeof (T); + + if (n * static_cast<int> (sizeof (T)) != byte_size) + error ("typecast: incorrect number of input values to make output value"); + + ArrayType retval (get_vec_dims (old_dims, n)); + VT *dest = reinterpret_cast<VT *> (retval.fortran_vec ()); + std::memcpy (dest, data, n * sizeof (VT)); + + return retval; +} + DEFUN (typecast, args, , doc: /* -*- texinfo -*- @deftypefn {} {@var{y} =} typecast (@var{x}, "@var{class}") @@ -218,27 +237,27 @@ else if (numclass[0] == 'i') { if (numclass == "int8") - retval = reinterpret_copy<int8NDArray> (data, byte_size, old_dims); + retval = reinterpret_int_copy<int8NDArray> (data, byte_size, old_dims); else if (numclass == "int16") - retval = reinterpret_copy<int16NDArray> (data, byte_size, old_dims); + retval = reinterpret_int_copy<int16NDArray> (data, byte_size, old_dims); else if (numclass == "int32") - retval = reinterpret_copy<int32NDArray> (data, byte_size, old_dims); + retval = reinterpret_int_copy<int32NDArray> (data, byte_size, old_dims); else if (numclass == "int64") - retval = reinterpret_copy<int64NDArray> (data, byte_size, old_dims); + retval = reinterpret_int_copy<int64NDArray> (data, byte_size, old_dims); } else if (numclass[0] == 'u') { if (numclass == "uint8") - retval = reinterpret_copy<uint8NDArray> (data, byte_size, old_dims); + retval = reinterpret_int_copy<uint8NDArray> (data, byte_size, old_dims); else if (numclass == "uint16") - retval = reinterpret_copy<uint16NDArray> (data, byte_size, - old_dims); + retval = reinterpret_int_copy<uint16NDArray> (data, byte_size, + old_dims); else if (numclass == "uint32") - retval = reinterpret_copy<uint32NDArray> (data, byte_size, - old_dims); + retval = reinterpret_int_copy<uint32NDArray> (data, byte_size, + old_dims); else if (numclass == "uint64") - retval = reinterpret_copy<uint64NDArray> (data, byte_size, - old_dims); + retval = reinterpret_int_copy<uint64NDArray> (data, byte_size, + old_dims); } else if (numclass == "single") retval = reinterpret_copy<FloatNDArray> (data, byte_size, old_dims);