# HG changeset patch # User Jaroslav Hajek # Date 1232549434 -3600 # Node ID c7ff200e45f59f30b0782030d904e1c8c5d4ee06 # Parent 3591fe09f3b1a74da26171a660e3aa9bb1a4f01c optimize range-scalar ops diff --git a/liboctave/ChangeLog b/liboctave/ChangeLog --- a/liboctave/ChangeLog +++ b/liboctave/ChangeLog @@ -1,3 +1,14 @@ +2009-01-21 Jaroslav Hajek + + * Range.cc ( operator + (double x, const Range& r), + operator + (const Range& r, double x), + operator - (double x, const Range& r), + operator - (const Range& r, double x), + operator * (double x, const Range& r), + operator * (const Range& r, double x)): New operators. + * Range.h: Declare them. + + 2009-01-20 John W. Eaton * file-stat.h, file-stat.cc (class base_file_stat): New base class. diff --git a/liboctave/Range.cc b/liboctave/Range.cc --- a/liboctave/Range.cc +++ b/liboctave/Range.cc @@ -294,6 +294,37 @@ return Range (-r.base (), -r.limit (), -r.inc ()); } +Range operator + (double x, const Range& r) +{ + return Range (x + r.base (), x + r.limit (), r.inc ()); +} + +Range operator + (const Range& r, double x) +{ + return Range (r.base () + x, r.limit () + x, r.inc ()); +} + +Range operator - (double x, const Range& r) +{ + return Range (x - r.base (), x - r.limit (), -r.inc ()); +} + +Range operator - (const Range& r, double x) +{ + return Range (r.base () - x, r.limit () - x, r.inc ()); +} + +Range operator * (double x, const Range& r) +{ + return Range (x * r.base (), x * r.limit (), x * r.inc ()); +} + +Range operator * (const Range& r, double x) +{ + return Range (r.base () * x, r.limit () * x, r.inc () * x); +} + + // C See Knuth, Art Of Computer Programming, Vol. 1, Problem 1.2.4-5. // C // C===Tolerant FLOOR function. diff --git a/liboctave/Range.h b/liboctave/Range.h --- a/liboctave/Range.h +++ b/liboctave/Range.h @@ -121,6 +121,18 @@ extern OCTAVE_API Range operator - (const Range& r); +extern OCTAVE_API Range operator + (double x, const Range& r); + +extern OCTAVE_API Range operator + (const Range& r, double x); + +extern OCTAVE_API Range operator - (double x, const Range& r); + +extern OCTAVE_API Range operator - (const Range& r, double x); + +extern OCTAVE_API Range operator * (double x, const Range& r); + +extern OCTAVE_API Range operator * (const Range& r, double x); + #endif /* diff --git a/src/ChangeLog b/src/ChangeLog --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,7 @@ +2009-01-21 Jaroslav Hajek + + * OPERATORS/op-range.cc: Define & register range-scalar ops. + 2009-01-21 Jaroslav Hajek * ov.h (octave_value::subsref (..., bool auto_add)): New method. diff --git a/src/OPERATORS/op-range.cc b/src/OPERATORS/op-range.cc --- a/src/OPERATORS/op-range.cc +++ b/src/OPERATORS/op-range.cc @@ -60,6 +60,13 @@ return octave_value (v.matrix_value().transpose ()); } +DEFBINOP_OP (addrs, range, scalar, +) +DEFBINOP_OP (addsr, scalar, range, +) +DEFBINOP_OP (subrs, range, scalar, -) +DEFBINOP_OP (subsr, scalar, range, -) +DEFBINOP_OP (mulrs, range, scalar, *) +DEFBINOP_OP (mulsr, scalar, range, *) + DEFNDCATOP_FN (r_r, range, range, array, array, concat) DEFNDCATOP_FN (r_s, range, scalar, array, array, concat) DEFNDCATOP_FN (r_m, range, matrix, array, array, concat) @@ -99,6 +106,13 @@ INSTALL_UNOP (op_transpose, octave_range, transpose); INSTALL_UNOP (op_hermitian, octave_range, transpose); + INSTALL_BINOP (op_add, octave_range, octave_scalar, addrs); + INSTALL_BINOP (op_add, octave_scalar, octave_range, addsr); + INSTALL_BINOP (op_sub, octave_range, octave_scalar, subrs); + INSTALL_BINOP (op_sub, octave_scalar, octave_range, subsr); + INSTALL_BINOP (op_mul, octave_range, octave_scalar, mulrs); + INSTALL_BINOP (op_mul, octave_scalar, octave_range, mulsr); + INSTALL_CATOP (octave_range, octave_range, r_r); INSTALL_CATOP (octave_range, octave_scalar, r_s); INSTALL_CATOP (octave_range, octave_matrix, r_m);