# HG changeset patch # User John W. Eaton # Date 1248435832 14400 # Node ID 1fddcf65155981774b445d7ebcf68c2890710bf7 # Parent cb0b21f34abce8b643f5b0227830766c2ecc5fd4 avoid complex -> real conversion when constructing arrays with [] diff -r cb0b21f34abc -r 1fddcf651559 src/ChangeLog --- a/src/ChangeLog Fri Jul 24 11:41:41 2009 +0200 +++ b/src/ChangeLog Fri Jul 24 07:43:52 2009 -0400 @@ -1,3 +1,8 @@ +2009-07-24 John W. Eaton + + * pt-mat.cc (DO_SINGLE_TYPE_CONCAT_NO_MUTATE): New macro. + (tree_matrix::rvalue1): Use it to avoid complex -> real conversion. + 2009-07-24 Jaroslav Hajek * DLD-FUNCIONS/cellfun.cc (Fcellfun): Avoid double error messages. diff -r cb0b21f34abc -r 1fddcf651559 src/pt-mat.cc --- a/src/pt-mat.cc Fri Jul 24 11:41:41 2009 +0200 +++ b/src/pt-mat.cc Fri Jul 24 07:43:52 2009 -0400 @@ -41,6 +41,8 @@ #include "ov.h" #include "variables.h" +#include "ov-cx-mat.h" +#include "ov-flt-cx-mat.h" #include "ov-re-sparse.h" #include "ov-cx-sparse.h" @@ -766,12 +768,23 @@ { \ TYPE result (dv); \ \ - SINGLE_TYPE_CONCAT(TYPE, EXTRACTOR); \ + SINGLE_TYPE_CONCAT (TYPE, EXTRACTOR); \ \ retval = result; \ } \ while (0) +#define DO_SINGLE_TYPE_CONCAT_NO_MUTATE(TYPE, EXTRACTOR, OV_TYPE) \ + do \ + { \ + TYPE result (dv); \ + \ + SINGLE_TYPE_CONCAT (TYPE, EXTRACTOR); \ + \ + retval = octave_value (new OV_TYPE (result)); \ + } \ + while (0) + octave_value tree_matrix::rvalue1 (int) { @@ -874,14 +887,18 @@ if (all_real_p) DO_SINGLE_TYPE_CONCAT (SparseMatrix, sparse_matrix_value); else - DO_SINGLE_TYPE_CONCAT (SparseComplexMatrix, sparse_complex_matrix_value); + DO_SINGLE_TYPE_CONCAT_NO_MUTATE (SparseComplexMatrix, + sparse_complex_matrix_value, + octave_sparse_complex_matrix); } else { if (all_real_p) DO_SINGLE_TYPE_CONCAT (NDArray, array_value); else - DO_SINGLE_TYPE_CONCAT (ComplexNDArray, complex_array_value); + DO_SINGLE_TYPE_CONCAT_NO_MUTATE (ComplexNDArray, + complex_array_value, + octave_complex_matrix); } } else if (result_type == "single") @@ -889,8 +906,9 @@ if (all_real_p) DO_SINGLE_TYPE_CONCAT (FloatNDArray, float_array_value); else - DO_SINGLE_TYPE_CONCAT (FloatComplexNDArray, - float_complex_array_value); + DO_SINGLE_TYPE_CONCAT_NO_MUTATE (FloatComplexNDArray, + float_complex_array_value, + octave_float_complex_matrix); } else if (result_type == "char") {