changeset 22063:55c20a3e3e59

ovl: new constructor with initializer_list to reduce code duplication. * libinterp/octave-value/ovl.h (ovl): remove the 11 repeated functions that eased the creation of an octave_value_list from 0 to 10 octave_value objects. Replace with a single function that makes use of variadic template. Also add new constructor that works with a initializer_list.
author Carnë Draug <carandraug@octave.org>
date Thu, 07 Jul 2016 17:22:25 +0100
parents d18aad835ad6
children bd4f3d2ce52f
files libinterp/octave-value/ovl.h
diffstat 1 files changed, 23 insertions(+), 149 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/octave-value/ovl.h	Thu Jul 07 10:28:31 2016 -0400
+++ b/libinterp/octave-value/ovl.h	Thu Jul 07 17:22:25 2016 +0100
@@ -28,6 +28,7 @@
 
 #include <string>
 #include <vector>
+#include <initializer_list>
 
 #include "str-vec.h"
 #include "Array.h"
@@ -56,6 +57,14 @@
   octave_value_list (const Array<octave_value>& d)
     : data (d.as_row ()), names () { }
 
+  octave_value_list (const std::initializer_list<octave_value>& args)
+    : data (dim_vector (1, args.size ())), names ()
+  {
+    octave_idx_type i = 0;
+    for (const octave_value& x : args)
+      data(i++) = x;
+  }
+
   octave_value_list (const Cell& tc)
     : data (tc.as_row ()), names () { }
 
@@ -167,158 +176,23 @@
 
 };
 
-// Make it easy to build argument lists for built-in functions,
-// or for returning values.
-
-inline octave_value_list
-ovl ()
-{
-  return octave_value_list ();
-}
+//! Construct an octave_value_list with less typing.
+/*!
+  Historically, this made it easier to create an octave_value_list
+  from multiple octave_value arguments.  It is no longer useful since
+  octave_value_list has now a constructor accepting an initializer_list
+  so all it does is save some typing.  The following are equivalent:
 
-inline octave_value_list
-ovl (const octave_value& a0)
-{
-  octave_value_list retval (1);
-  retval(0) = a0;
-  return retval;
-}
-
-inline octave_value_list
-ovl (const octave_value& a0, const octave_value& a1)
-{
-  octave_value_list retval (2);
-  retval(1) = a1;
-  retval(0) = a0;
-  return retval;
-}
-
+  @code{.cc}
+  return octave_value_list ({ov0, ov1, ov2});
+  return ovl (ov0, ov1, ov2);
+  @endcode
+*/
+template<typename... OV_Args>
 inline octave_value_list
-ovl (const octave_value& a0, const octave_value& a1,
-     const octave_value& a2)
-{
-  octave_value_list retval (3);
-  retval(2) = a2;
-  retval(1) = a1;
-  retval(0) = a0;
-  return retval;
-}
-
-inline octave_value_list
-ovl (const octave_value& a0, const octave_value& a1,
-     const octave_value& a2, const octave_value& a3)
-{
-  octave_value_list retval (4);
-  retval(3) = a3;
-  retval(2) = a2;
-  retval(1) = a1;
-  retval(0) = a0;
-  return retval;
-}
-
-inline octave_value_list
-ovl (const octave_value& a0, const octave_value& a1,
-     const octave_value& a2, const octave_value& a3,
-     const octave_value& a4)
-{
-  octave_value_list retval (5);
-  retval(4) = a4;
-  retval(3) = a3;
-  retval(2) = a2;
-  retval(1) = a1;
-  retval(0) = a0;
-  return retval;
-}
-
-inline octave_value_list
-ovl (const octave_value& a0, const octave_value& a1,
-     const octave_value& a2, const octave_value& a3,
-     const octave_value& a4, const octave_value& a5)
+ovl (const OV_Args&... args)
 {
-  octave_value_list retval (6);
-  retval(5) = a5;
-  retval(4) = a4;
-  retval(3) = a3;
-  retval(2) = a2;
-  retval(1) = a1;
-  retval(0) = a0;
-  return retval;
-}
-
-inline octave_value_list
-ovl (const octave_value& a0, const octave_value& a1,
-     const octave_value& a2, const octave_value& a3,
-     const octave_value& a4, const octave_value& a5,
-     const octave_value& a6)
-{
-  octave_value_list retval (7);
-  retval(6) = a6;
-  retval(5) = a5;
-  retval(4) = a4;
-  retval(3) = a3;
-  retval(2) = a2;
-  retval(1) = a1;
-  retval(0) = a0;
-  return retval;
-}
-
-inline octave_value_list
-ovl (const octave_value& a0, const octave_value& a1,
-     const octave_value& a2, const octave_value& a3,
-     const octave_value& a4, const octave_value& a5,
-     const octave_value& a6, const octave_value& a7)
-{
-  octave_value_list retval (8);
-  retval(7) = a7;
-  retval(6) = a6;
-  retval(5) = a5;
-  retval(4) = a4;
-  retval(3) = a3;
-  retval(2) = a2;
-  retval(1) = a1;
-  retval(0) = a0;
-  return retval;
-}
-
-inline octave_value_list
-ovl (const octave_value& a0, const octave_value& a1,
-     const octave_value& a2, const octave_value& a3,
-     const octave_value& a4, const octave_value& a5,
-     const octave_value& a6, const octave_value& a7,
-     const octave_value& a8)
-{
-  octave_value_list retval (9);
-  retval(8) = a8;
-  retval(7) = a7;
-  retval(6) = a6;
-  retval(5) = a5;
-  retval(4) = a4;
-  retval(3) = a3;
-  retval(2) = a2;
-  retval(1) = a1;
-  retval(0) = a0;
-  return retval;
-}
-
-inline octave_value_list
-ovl (const octave_value& a0, const octave_value& a1,
-     const octave_value& a2, const octave_value& a3,
-     const octave_value& a4, const octave_value& a5,
-     const octave_value& a6, const octave_value& a7,
-     const octave_value& a8, const octave_value& a9)
-{
-  octave_value_list retval (10);
-  retval(9) = a9;
-  retval(8) = a8;
-  retval(7) = a7;
-  retval(6) = a6;
-  retval(5) = a5;
-  retval(4) = a4;
-  retval(3) = a3;
-  retval(2) = a2;
-  retval(1) = a1;
-  retval(0) = a0;
-  return retval;
+  return octave_value_list ({args...});
 }
 
 #endif