# HG changeset patch # User jwe # Date 845398228 0 # Node ID 367485171742eff5e77eff15170f29ca9f76325e # Parent 47e5f57fb4bd4d936fe4466e9b12a2beee97a9e1 [project @ 1996-10-15 16:50:27 by jwe] diff -r 47e5f57fb4bd -r 367485171742 src/ov-base.h --- a/src/ov-base.h Tue Oct 15 16:44:26 1996 +0000 +++ b/src/ov-base.h Tue Oct 15 16:50:28 1996 +0000 @@ -67,8 +67,11 @@ void operator delete (void *p, size_t size); #endif - numeric_conv_fcn numeric_conversion_function (void) const - { return (numeric_conv_fcn) 0; } + type_conv_fcn numeric_conversion_function (void) const + { return (type_conv_fcn) 0; } + + octave_value *try_narrowing_conversion (void) + { return (octave_value *) 0; } octave_value index (const octave_value_list& idx) const; diff -r 47e5f57fb4bd -r 367485171742 src/ov-complex.cc --- a/src/ov-complex.cc Tue Oct 15 16:44:26 1996 +0000 +++ b/src/ov-complex.cc Tue Oct 15 16:50:28 1996 +0000 @@ -31,7 +31,9 @@ #include "lo-ieee.h" #include "oct-obj.h" +#include "ops.h" #include "ov-complex.h" +#include "ov-scalar.h" #include "gripes.h" #include "pr-output.h" @@ -39,6 +41,17 @@ const string octave_complex::t_name ("complex scalar"); +octave_value * +octave_complex::try_narrowing_conversion (void) +{ + octave_value *retval = 0; + + if (imag (scalar) == 0.0) + retval = new octave_scalar (::real (scalar)); + + return retval; +} + static inline bool valid_scalar_indices (const octave_value_list& args) { diff -r 47e5f57fb4bd -r 367485171742 src/ov-complex.h --- a/src/ov-complex.h Tue Oct 15 16:44:26 1996 +0000 +++ b/src/ov-complex.h Tue Oct 15 16:50:28 1996 +0000 @@ -70,6 +70,8 @@ void operator delete (void *p, size_t size); #endif + octave_value *try_narrowing_conversion (void); + octave_value index (const octave_value_list& idx) const; int rows (void) const { return 1; } diff -r 47e5f57fb4bd -r 367485171742 src/ov-cx-mat.cc --- a/src/ov-cx-mat.cc Tue Oct 15 16:44:26 1996 +0000 +++ b/src/ov-cx-mat.cc Tue Oct 15 16:50:28 1996 +0000 @@ -33,7 +33,11 @@ #include "gripes.h" #include "oct-obj.h" +#include "ops.h" +#include "ov-complex.h" #include "ov-cx-mat.h" +#include "ov-re-mat.h" +#include "ov-scalar.h" #include "pr-output.h" int octave_complex_matrix::t_id = -1; @@ -52,7 +56,30 @@ matrix ((pcv < 0 && Vprefer_column_vectors) || pcv ? ComplexMatrix (v) : ComplexMatrix (v.transpose ())) { } -extern void assign (Array2&, const Array2&); +octave_value * +octave_complex_matrix::try_narrowing_conversion (void) +{ + octave_value *retval = 0; + + int nr = matrix.rows (); + int nc = matrix.cols (); + + if (nr == 1 && nc == 1) + { + Complex c = matrix (0, 0); + + if (imag (c) == 0.0) + retval = new octave_scalar (::real (c)); + else + retval = new octave_complex (c); + } + else if (nr == 0 && nc == 0) + retval = new octave_matrix (Matrix ()); + else if (matrix.all_elements_are_real ()) + retval = new octave_matrix (::real (matrix)); + + return retval; +} octave_value octave_complex_matrix::index (const octave_value_list& idx) const @@ -88,6 +115,8 @@ return retval; } +extern void assign (Array2&, const Array2&); + void octave_complex_matrix::assign (const octave_value_list& idx, const ComplexMatrix& rhs) diff -r 47e5f57fb4bd -r 367485171742 src/ov-cx-mat.h --- a/src/ov-cx-mat.h Tue Oct 15 16:44:26 1996 +0000 +++ b/src/ov-cx-mat.h Tue Oct 15 16:50:28 1996 +0000 @@ -77,6 +77,8 @@ void operator delete (void *p, size_t size); #endif + octave_value *try_narrowing_conversion (void); + octave_value index (const octave_value_list& idx) const; void assign (const octave_value_list& idx, const ComplexMatrix& rhs); diff -r 47e5f57fb4bd -r 367485171742 src/ov-range.cc --- a/src/ov-range.cc Tue Oct 15 16:44:26 1996 +0000 +++ b/src/ov-range.cc Tue Oct 15 16:50:28 1996 +0000 @@ -35,6 +35,7 @@ #include "ops.h" #include "ov-range.h" #include "ov-re-mat.h" +#include "ov-scalar.h" #include "pr-output.h" int octave_range::t_id = -1; @@ -49,12 +50,34 @@ return new octave_matrix (v.matrix_value ()); } -octave_value::numeric_conv_fcn +octave_value::type_conv_fcn octave_range::numeric_conversion_function (void) const { return default_numeric_conversion_function; } +octave_value * +octave_range::try_narrowing_conversion (void) +{ + octave_value *retval = 0; + + switch (range.nelem ()) + { + case 1: + retval = new octave_scalar (range.base ()); + break; + + case 0: + retval = new octave_matrix (Matrix ()); + break; + + default: + break; + } + + return retval; +} + double octave_range::double_value (bool) const { diff -r 47e5f57fb4bd -r 367485171742 src/ov-range.h --- a/src/ov-range.h Tue Oct 15 16:44:26 1996 +0000 +++ b/src/ov-range.h Tue Oct 15 16:50:28 1996 +0000 @@ -85,7 +85,9 @@ void operator delete (void *p, size_t size); #endif - numeric_conv_fcn numeric_conversion_function (void) const; + type_conv_fcn numeric_conversion_function (void) const; + + octave_value *try_narrowing_conversion (void); idx_vector index_vector (void) const { return idx_vector (range); } diff -r 47e5f57fb4bd -r 367485171742 src/ov-re-mat.cc --- a/src/ov-re-mat.cc Tue Oct 15 16:44:26 1996 +0000 +++ b/src/ov-re-mat.cc Tue Oct 15 16:50:28 1996 +0000 @@ -35,6 +35,8 @@ #include "gripes.h" #include "mappers.h" #include "oct-obj.h" +#include "ops.h" +#include "ov-scalar.h" #include "ov-re-mat.h" #include "pr-output.h" @@ -54,6 +56,20 @@ #include +octave_value * +octave_matrix::try_narrowing_conversion (void) +{ + octave_value *retval = 0; + + int nr = matrix.rows (); + int nc = matrix.cols (); + + if (nr == 1 && nc == 1) + retval = new octave_scalar (matrix (0, 0)); + + return retval; +} + octave_value octave_matrix::index (const octave_value_list& idx) const { diff -r 47e5f57fb4bd -r 367485171742 src/ov-re-mat.h --- a/src/ov-re-mat.h Tue Oct 15 16:44:26 1996 +0000 +++ b/src/ov-re-mat.h Tue Oct 15 16:50:28 1996 +0000 @@ -77,6 +77,8 @@ void operator delete (void *p, size_t size); #endif + octave_value *try_narrowing_conversion (void); + octave_value index (const octave_value_list& idx) const; void assign (const octave_value_list& idx, const Matrix& rhs); diff -r 47e5f57fb4bd -r 367485171742 src/ov.cc --- a/src/ov.cc Tue Oct 15 16:44:26 1996 +0000 +++ b/src/ov.cc Tue Oct 15 16:50:28 1996 +0000 @@ -303,7 +303,7 @@ void octave_value::maybe_mutate (void) { - octave_value *tmp = rep->try_narrow_conversion (); + octave_value *tmp = rep->try_narrowing_conversion (); if (tmp && tmp != rep) { diff -r 47e5f57fb4bd -r 367485171742 src/ov.h --- a/src/ov.h Tue Oct 15 16:44:26 1996 +0000 +++ b/src/ov.h Tue Oct 15 16:50:28 1996 +0000 @@ -178,8 +178,8 @@ void maybe_mutate (void); - virtual octave_value *try_narrow_conversion (void) - { return rep->try_narrow_conversion (); } + virtual octave_value *try_narrowing_conversion (void) + { return rep->try_narrowing_conversion (); } virtual octave_value index (const octave_value_list& idx) const { return rep->index (idx); }