# HG changeset patch # User jwe # Date 845398946 0 # Node ID 44753e0cadf23a890a242546d16a72f3d747f9ca # Parent 1a19015644927cb5b53c23bbeebc89a28f043d20 [project @ 1996-10-15 17:02:26 by jwe] diff --git a/src/ov.cc b/src/ov.cc --- a/src/ov.cc +++ b/src/ov.cc @@ -316,147 +316,12 @@ } static void -gripe_indexed_assignment (const string& tn1, const string& tn2) -{ - error ("assignment of %s to indexed %s not implemented", - tn2.c_str (), tn1.c_str ()); -} - -static void gripe_no_conversion (const string& tn1, const string& tn2) { error ("no suitable conversion found for assignment of %s to indexed %s", tn2.c_str (), tn1.c_str ()); } -static void -gripe_conversion_failed (const string& tn1, const string& tn2) -{ - error ("type conversion for assignment of %s to indexed %s failed", - tn2.c_str (), tn1.c_str ()); -} - -bool -octave_value::convert_and_assign (const octave_value_list& idx, - const octave_value& rhs) -{ - bool assignment_ok = false; - - int t_lhs = type_id (); - int t_rhs = rhs.type_id (); - - int t_result - = octave_value_typeinfo::lookup_pref_assign_conv (t_lhs, t_rhs); - - if (t_result >= 0) - { - octave_value::type_conv_fcn cf - = octave_value_typeinfo::lookup_widening_op (t_lhs, t_result); - - if (cf) - { - octave_value *tmp = cf (*rep); - - if (tmp) - { - if (tmp != rep) - { - if (--rep->count == 0) - delete rep; - - rep = tmp; - rep->count = 1; - } - else - delete tmp; - - assignment_ok = try_assignment (idx, rhs); - } - else - gripe_conversion_failed (type_name (), rhs.type_name ()); - } - else - gripe_indexed_assignment (type_name (), rhs.type_name ()); - } - - return (assignment_ok && ! error_state); -} - -bool -octave_value::try_assignment_with_conversion (const octave_value_list& idx, - const octave_value& rhs) -{ - bool assignment_ok = convert_and_assign (idx, rhs); - - if (! (error_state || assignment_ok)) - { - octave_value tmp_rhs; - octave_value::type_conv_fcn cf_rhs = rhs.numeric_conversion_function (); - - if (cf_rhs) - tmp_rhs = octave_value (cf_rhs (*rhs.rep)); - else - tmp_rhs = rhs; - - octave_value *old_rep = 0; - octave_value::type_conv_fcn cf_this = numeric_conversion_function (); - - if (cf_this) - { - old_rep = rep; - rep = cf_this (*rep); - rep->count = 1; - } - - cerr << type_name () << "\n"; - cerr << tmp_rhs.type_name () << "\n"; - - if (cf_this || cf_rhs) - { - assignment_ok = try_assignment (idx, tmp_rhs); - - if (! (error_state || assignment_ok)) - assignment_ok = convert_and_assign (idx, tmp_rhs); - } - - if (! assignment_ok && old_rep) - { - if (--rep->count == 0) - delete rep; - - rep = old_rep; - old_rep = 0; - } - - if (old_rep && --old_rep->count == 0) - delete old_rep; - } - - return (assignment_ok && ! error_state); -} - -bool -octave_value::try_assignment (const octave_value_list& idx, - const octave_value& rhs) -{ - bool retval = false; - - int t_lhs = type_id (); - int t_rhs = rhs.type_id (); - - octave_value::assign_op_fcn f - = octave_value_typeinfo::lookup_assign_op (t_lhs, t_rhs); - - if (f) - { - f (*rep, idx, *(rhs.rep)); - - retval = (! error_state); - } - - return retval; -} - octave_value& octave_value::assign (const octave_value_list& idx, const octave_value& rhs) { @@ -627,6 +492,141 @@ } static void +gripe_indexed_assignment (const string& tn1, const string& tn2) +{ + error ("assignment of %s to indexed %s not implemented", + tn2.c_str (), tn1.c_str ()); +} + +static void +gripe_conversion_failed (const string& tn1, const string& tn2) +{ + error ("type conversion for assignment of %s to indexed %s failed", + tn2.c_str (), tn1.c_str ()); +} + +bool +octave_value::convert_and_assign (const octave_value_list& idx, + const octave_value& rhs) +{ + bool assignment_ok = false; + + int t_lhs = type_id (); + int t_rhs = rhs.type_id (); + + int t_result + = octave_value_typeinfo::lookup_pref_assign_conv (t_lhs, t_rhs); + + if (t_result >= 0) + { + octave_value::type_conv_fcn cf + = octave_value_typeinfo::lookup_widening_op (t_lhs, t_result); + + if (cf) + { + octave_value *tmp = cf (*rep); + + if (tmp) + { + if (tmp != rep) + { + if (--rep->count == 0) + delete rep; + + rep = tmp; + rep->count = 1; + } + else + delete tmp; + + assignment_ok = try_assignment (idx, rhs); + } + else + gripe_conversion_failed (type_name (), rhs.type_name ()); + } + else + gripe_indexed_assignment (type_name (), rhs.type_name ()); + } + + return (assignment_ok && ! error_state); +} + +bool +octave_value::try_assignment_with_conversion (const octave_value_list& idx, + const octave_value& rhs) +{ + bool assignment_ok = convert_and_assign (idx, rhs); + + if (! (error_state || assignment_ok)) + { + octave_value tmp_rhs; + octave_value::type_conv_fcn cf_rhs = rhs.numeric_conversion_function (); + + if (cf_rhs) + tmp_rhs = octave_value (cf_rhs (*rhs.rep)); + else + tmp_rhs = rhs; + + octave_value *old_rep = 0; + octave_value::type_conv_fcn cf_this = numeric_conversion_function (); + + if (cf_this) + { + old_rep = rep; + rep = cf_this (*rep); + rep->count = 1; + } + + cerr << type_name () << "\n"; + cerr << tmp_rhs.type_name () << "\n"; + + if (cf_this || cf_rhs) + { + assignment_ok = try_assignment (idx, tmp_rhs); + + if (! (error_state || assignment_ok)) + assignment_ok = convert_and_assign (idx, tmp_rhs); + } + + if (! assignment_ok && old_rep) + { + if (--rep->count == 0) + delete rep; + + rep = old_rep; + old_rep = 0; + } + + if (old_rep && --old_rep->count == 0) + delete old_rep; + } + + return (assignment_ok && ! error_state); +} + +bool +octave_value::try_assignment (const octave_value_list& idx, + const octave_value& rhs) +{ + bool retval = false; + + int t_lhs = type_id (); + int t_rhs = rhs.type_id (); + + octave_value::assign_op_fcn f + = octave_value_typeinfo::lookup_assign_op (t_lhs, t_rhs); + + if (f) + { + f (*rep, idx, *(rhs.rep)); + + retval = (! error_state); + } + + return retval; +} + +static void gripe_binary_op (const string& on, const string& tn1, const string& tn2) { error ("binary operator %s not implemented for %s by %s operations", diff --git a/src/ov.h b/src/ov.h --- a/src/ov.h +++ b/src/ov.h @@ -184,15 +184,6 @@ virtual octave_value index (const octave_value_list& idx) const { return rep->index (idx); } - bool convert_and_assign (const octave_value_list& idx, - const octave_value& rhs); - - bool try_assignment_with_conversion (const octave_value_list& idx, - const octave_value& rhs); - - bool try_assignment (const octave_value_list& idx, - const octave_value& rhs); - octave_value& assign (const octave_value_list& idx, const octave_value& rhs); virtual idx_vector index_vector (void) const @@ -204,19 +195,6 @@ virtual octave_value& struct_elt_ref (const string& nm) { return rep->struct_elt_ref (nm); } -#if 0 - // Simple structure assignment. - - octave_value assign_map_element (SLList& list, - octave_value& rhs); - - // Indexed structure assignment. - - octave_value assign_map_element (SLList& list, - octave_value& rhs, - const octave_value_list& args); -#endif - // Size. virtual int rows (void) const @@ -361,18 +339,6 @@ rep->decrement (); } -#if 0 - virtual octave_value - lookup_map_element (const string& ref, bool insert = false, - bool silent = false) - { return lookup_map_element (ref, insert, silent); } - - virtual octave_value - lookup_map_element (SLList& list, bool insert = false, - bool silent = false) - { return rep->lookup_map_element (list, insert, silent); } -#endif - ColumnVector vector_value (bool frc_str_conv = false, bool frc_vec_conv = false) const; @@ -403,15 +369,6 @@ virtual string type_name (void) const { return rep->type_name (); } -#if 0 - octave_value_rep *make_unique_map (void); - - // We want to eliminate this, or at least make it private. - - virtual octave_value_rep::constant_type const_type (void) const - { return rep->const_type (); } -#endif - virtual void convert_to_matrix_type (bool make_complex) { rep->convert_to_matrix_type (make_complex); } @@ -428,15 +385,6 @@ return *this; } -#if 0 - { - if (is_numeric_type ()) - return *this; - else - return rep->make_numeric (frc_str_conv); - } -#endif - bool print_as_scalar (void); bool print_as_structure (void) { return is_map (); } @@ -458,6 +406,15 @@ octave_value *rep; // The real representation. int count; // A reference count. }; + + bool convert_and_assign (const octave_value_list& idx, + const octave_value& rhs); + + bool try_assignment_with_conversion (const octave_value_list& idx, + const octave_value& rhs); + + bool try_assignment (const octave_value_list& idx, + const octave_value& rhs); }; // If TRUE, allow assignments like