diff liboctave/mx-inlines.cc @ 9607:1be3c73ed7b5

reuse temporary arrays in nested expressions
author Jaroslav Hajek <highegg@gmail.com>
date Thu, 03 Sep 2009 08:48:51 +0200
parents 7dafdb8b062f
children 66970dd627f6
line wrap: on
line diff
--- a/liboctave/mx-inlines.cc
+++ b/liboctave/mx-inlines.cc
@@ -49,6 +49,13 @@
 
 DEFMXUNOP (mx_inline_uminus, -)
 
+#define DEFMXUNOPEQ(F, OP) \
+template <class R> \
+inline void F (size_t n, R *r) \
+{ for (size_t i = 0; i < n; i++) r[i] = OP r[i]; }
+
+DEFMXUNOPEQ (mx_inline_uminus2, -)
+
 #define DEFMXUNBOOLOP(F, OP) \
 template <class X> \
 inline void F (size_t n, bool *r, const X *x) \
@@ -127,6 +134,11 @@
     r[i] = ! logical_value (x[i]);
 }
 
+inline void mx_inline_not2 (size_t n, bool *r)
+{
+  for (size_t i = 0; i < n; i++) r[i] = ! r[i];
+}
+
 #define DEFMXBOOLOP(F, NOT1, OP, NOT2) \
 template <class X, class Y> \
 inline void F (size_t n, bool *r, const X *x, const Y *y) \
@@ -222,6 +234,16 @@
   return r;
 }
 
+template <class RNDA>
+inline RNDA&
+do_mx_inplace_op (RNDA& r,
+                  void (*op) (size_t, typename RNDA::element_type *))
+{
+  op (r.numel (), r.fortran_vec ());
+  return r;
+}
+
+
 template <class RNDA, class XNDA, class YNDA>
 inline RNDA 
 do_mm_binary_op (const XNDA& x, const YNDA& y,