Mercurial > octave
diff src/OPERATORS/op-class.cc @ 7338:5215422865e0
[project @ 2007-12-28 22:31:35 by jwe]
author | jwe |
---|---|
date | Fri, 28 Dec 2007 22:32:23 +0000 |
parents | |
children | 1e1e2608da7b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/OPERATORS/op-class.cc Fri Dec 28 22:32:23 2007 +0000 @@ -0,0 +1,168 @@ +/* + +Copyright (C) 2007 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, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301, USA. + +*/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "oct-time.h" + +#include "gripes.h" +#include "load-path.h" +#include "oct-obj.h" +#include "ov.h" +#include "ov-class.h" +#include "ov-typeinfo.h" +#include "ops.h" +#include "symtab.h" +#include "parse.h" + +// class ops. + +#define DEF_CLASS_UNOP(name) \ + static octave_value \ + oct_unop_ ## name (const octave_value& a) \ + { \ + octave_value retval; \ + \ + std::string class_name = a.class_name (); \ + \ + octave_value meth = symbol_table::find_method (#name, class_name); \ + \ + if (meth.is_defined ()) \ + { \ + octave_value_list args; \ + \ + args(0) = a; \ + \ + octave_value_list tmp = feval (meth.function_value (), args, 1); \ + \ + if (tmp.length () > 0) \ + retval = tmp(0); \ + } \ + else \ + error ("%s method not defined for %s class", \ + #name, class_name.c_str ()); \ + \ + return retval; \ + } + +DEF_CLASS_UNOP (not) +DEF_CLASS_UNOP (uplus) +DEF_CLASS_UNOP (uminus) +DEF_CLASS_UNOP (transpose) +DEF_CLASS_UNOP (ctranspose) + +// FIXME -- we need to handle precedence in the binop function. + +#define DEF_CLASS_BINOP(name) \ + static octave_value \ + oct_binop_ ## name (const octave_value& a1, const octave_value& a2) \ + { \ + octave_value retval; \ + \ + std::string dispatch_type \ + = a1.is_object () ? a1.class_name () : a2.class_name (); \ + \ + octave_value meth = symbol_table::find_method (#name, dispatch_type); \ + \ + if (meth.is_defined ()) \ + { \ + octave_value_list args; \ + \ + args(1) = a2; \ + args(0) = a1; \ + \ + octave_value_list tmp = feval (meth.function_value (), args, 1); \ + \ + if (tmp.length () > 0) \ + retval = tmp(0); \ + } \ + else \ + error ("%s method not defined for %s class", \ + #name, dispatch_type.c_str ()); \ + \ + return retval; \ + } + +DEF_CLASS_BINOP (plus) +DEF_CLASS_BINOP (minus) +DEF_CLASS_BINOP (mtimes) +DEF_CLASS_BINOP (mrdivide) +DEF_CLASS_BINOP (mpower) +DEF_CLASS_BINOP (mldivide) +DEF_CLASS_BINOP (lt) +DEF_CLASS_BINOP (le) +DEF_CLASS_BINOP (eq) +DEF_CLASS_BINOP (ge) +DEF_CLASS_BINOP (gt) +DEF_CLASS_BINOP (ne) +DEF_CLASS_BINOP (times) +DEF_CLASS_BINOP (rdivide) +DEF_CLASS_BINOP (power) +DEF_CLASS_BINOP (ldivide) +DEF_CLASS_BINOP (and) +DEF_CLASS_BINOP (or) + +#define INSTALL_CLASS_UNOP(op, f) \ + octave_value_typeinfo::register_unary_class_op \ + (octave_value::op, oct_unop_ ## f) + +#define INSTALL_CLASS_BINOP(op, f) \ + octave_value_typeinfo::register_binary_class_op \ + (octave_value::op, oct_binop_ ## f) + +void +install_class_ops (void) +{ + INSTALL_CLASS_UNOP (op_not, not); + INSTALL_CLASS_UNOP (op_uplus, uplus); + INSTALL_CLASS_UNOP (op_uminus, uminus); + INSTALL_CLASS_UNOP (op_transpose, transpose); + INSTALL_CLASS_UNOP (op_hermitian, ctranspose); + + INSTALL_CLASS_BINOP (op_add, plus); + INSTALL_CLASS_BINOP (op_sub, minus); + INSTALL_CLASS_BINOP (op_mul, mtimes); + INSTALL_CLASS_BINOP (op_div, mrdivide); + INSTALL_CLASS_BINOP (op_pow, mpower); + INSTALL_CLASS_BINOP (op_ldiv, mldivide); + INSTALL_CLASS_BINOP (op_lt, lt); + INSTALL_CLASS_BINOP (op_le, le); + INSTALL_CLASS_BINOP (op_eq, eq); + INSTALL_CLASS_BINOP (op_ge, ge); + INSTALL_CLASS_BINOP (op_gt, gt); + INSTALL_CLASS_BINOP (op_ne, ne); + INSTALL_CLASS_BINOP (op_el_mul, times); + INSTALL_CLASS_BINOP (op_el_div, rdivide); + INSTALL_CLASS_BINOP (op_el_pow, power); + INSTALL_CLASS_BINOP (op_el_ldiv, ldivide); + INSTALL_CLASS_BINOP (op_el_and, and); + INSTALL_CLASS_BINOP (op_el_or, or); +} + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/