Mercurial > hg > octave-shane
changeset 2952:c4bc40161199
[project @ 1997-05-09 14:49:47 by jwe]
author | jwe |
---|---|
date | Fri, 09 May 1997 14:49:47 +0000 |
parents | ab9673e3bb5d |
children | ca7d3625ee01 |
files | src/oct-var-ref.cc src/oct-var-ref.h |
diffstat | 2 files changed, 167 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/src/oct-var-ref.cc @@ -0,0 +1,63 @@ +/* + +Copyright (C) 1996, 1997 John W. Eaton + +This file is part of Octave. + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with Octave; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "oct-obj.h" +#include "oct-var-ref.h" +#include "ov.h" + +void +octave_variable_reference::assign (octave_value::assign_op op, + const octave_value& rhs) +{ + octave_value saved_val; + + if (chg_fcn) + octave_value saved_val = *val; + + if (idx.empty ()) + { + if (struct_elt_name.empty ()) + val->assign (op, rhs); + else + val->assign_struct_elt (op, struct_elt_name, rhs); + } + else + { + if (struct_elt_name.empty ()) + val->assign (op, idx, rhs); + else + val->assign_struct_elt (op, struct_elt_name, idx, rhs); + } + + if (chg_fcn && chg_fcn () < 0) + *val = saved_val; +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/
new file mode 100644 --- /dev/null +++ b/src/oct-var-ref.h @@ -0,0 +1,104 @@ +/* + +Copyright (C) 1996, 1997 John W. Eaton + +This file is part of Octave. + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with Octave; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#if !defined (octave_variable_reference_h) +#define octave_variable_reference_h 1 + +class octave_value; +class octave_value_list; + +#include <string> + +#include "oct-obj.h" +#include "symtab.h" + +class +octave_variable_reference +{ +public: + + octave_variable_reference (octave_value *v = 0, + symbol_record::sv_function f = 0) + : val (v), idx (), chg_fcn (f), struct_elt_name () { } + + octave_variable_reference (octave_value *v, const string& nm, + symbol_record::sv_function f = 0) + : val (v), idx (), chg_fcn (f), struct_elt_name (nm) { } + + octave_variable_reference (const octave_variable_reference& vr) + : val (vr.val), idx (vr.idx), chg_fcn (vr.chg_fcn), + struct_elt_name (vr.struct_elt_name) { } + + octave_variable_reference& operator = (const octave_variable_reference& vr) + { + if (this != &vr) + { + val = vr.val; + idx = vr.idx; + chg_fcn = vr.chg_fcn; + struct_elt_name = vr.struct_elt_name; + } + + return *this; + } + + ~octave_variable_reference (void) { } + + bool is_undefined (void) { return val->is_undefined (); } + + void define (const octave_value& v) { *val = v; } + + void assign (octave_value::assign_op, const octave_value&); + + octave_variable_reference struct_elt_ref (const string& nm) + { return val->struct_elt_ref (nm); } + + void index (const octave_value_list& i) { idx = i; } + + void increment (void) { val->increment (); } + + void decrement (void) { val->decrement (); } + + octave_value value (void) + { + return struct_elt_name.empty () + ? *val : val->struct_elt_val (struct_elt_name); + } + +private: + + octave_value *val; + + octave_value_list idx; + + symbol_record::sv_function chg_fcn; + + string struct_elt_name; +}; + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/