Mercurial > octave
changeset 27340:6da4c6c0dc65
use std::vector<octave_value> for octave_value_list (bug #56752)
* ovl.h, ovl.cc (octave_value_list::data): Define using
std::vector<octave_value> instead of Array<octave_value>.
Adapt all uses.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Fri, 16 Aug 2019 01:39:49 -0400 |
parents | 64289bf338da |
children | 6eba4cf92af0 |
files | libinterp/octave-value/ovl.cc libinterp/octave-value/ovl.h |
diffstat | 2 files changed, 60 insertions(+), 30 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/octave-value/ovl.cc Wed Aug 14 00:19:34 2019 -0400 +++ b/libinterp/octave-value/ovl.cc Fri Aug 16 01:39:49 2019 -0400 @@ -49,13 +49,14 @@ data = lst.front ().data; else if (nel > 0) { - data.resize (dim_vector (1, nel)); + data.resize (nel); octave_idx_type k = 0; for (const auto& ovl : lst) { - data.assign (idx_vector (k, k + ovl.length ()), ovl.data); - k += ovl.length (); + for (octave_idx_type i = 0; i < ovl.length (); i++) + data[k++] = ovl(i); } + assert (k == nel); } @@ -262,13 +263,13 @@ octave_value_list::make_storable_values (void) { octave_idx_type len = length (); - const Array<octave_value>& cdata = data; + const std::vector<octave_value>& cdata = data; for (octave_idx_type i = 0; i < len; i++) { // This is optimized so that we don't force a copy unless necessary. - octave_value tmp = cdata(i).storable_value (); - if (! tmp.is_copy_of (cdata (i))) - data(i) = tmp; + octave_value tmp = cdata[i].storable_value (); + if (! tmp.is_copy_of (cdata[i])) + data[i] = tmp; } }
--- a/libinterp/octave-value/ovl.h Wed Aug 14 00:19:34 2019 -0400 +++ b/libinterp/octave-value/ovl.h Fri Aug 16 01:39:49 2019 -0400 @@ -46,23 +46,37 @@ : data (), names () { } explicit octave_value_list (octave_idx_type n) - : data (dim_vector (1, n)), names () { } + : data (n), names () { } octave_value_list (octave_idx_type n, const octave_value& val) - : data (dim_vector (1, n), val), names () { } + : data (n, val), names () { } octave_value_list (const octave_value& tc) - : data (dim_vector (1, 1), tc), names () { } + : data (1, tc), names () { } template<template <typename...> class OV_Container> octave_value_list (const OV_Container<octave_value>& args) - : data (args, dim_vector (1, args.size ())), names () { } + : data (args.size ()), names () + { + auto p = args.begin (); + + for (size_t i = 0; i < data.size (); i++) + data[i] = *p++; + } - octave_value_list (const Array<octave_value>& d) - : data (d.as_row ()), names () { } + octave_value_list (const Array<octave_value>& a) + : data (a.numel ()), names () + { + for (octave_idx_type i = 0; i < a.numel (); i++) + data[i] = a(i); + } - octave_value_list (const Cell& tc) - : data (tc.as_row ()), names () { } + octave_value_list (const Cell& c) + : data (c.numel ()), names () + { + for (octave_idx_type i = 0; i < c.numel (); i++) + data[i] = c(i); + } octave_value_list (const octave_value_list& obj) : data (obj.data), names (obj.names) { } @@ -83,7 +97,20 @@ return *this; } - Array<octave_value> array_value (void) const { return data; } + Array<octave_value> array_value (void) const + { + Array<octave_value> retval; + + if (data.size () > 0) + { + retval.resize (dim_vector (1, length ())); + + for (octave_idx_type i = 0; i < retval.numel (); i++) + retval(i) = data[i]; + } + + return retval; + } Cell cell_value (void) const { return array_value (); } @@ -93,13 +120,13 @@ const octave_value& operator () (octave_idx_type n) const { return elem (n); } - octave_idx_type length (void) const { return data.numel (); } + octave_idx_type length (void) const { return data.size (); } bool empty (void) const { return length () == 0; } void resize (octave_idx_type n, const octave_value& rfv = octave_value ()) { - data.resize (dim_vector (1, n), rfv); + data.resize (n, rfv); } octave_value_list& prepend (const octave_value& val); @@ -115,14 +142,17 @@ { // linear_slice uses begin/end indices instead of offset and length. // Avoid calling with upper bound out of range. - // linear_slice handles the case of len < 0. - octave_value_list retval - = data.linear_slice (offset, std::min (offset + len, length ())); + octave_idx_type tlen = len > 0 ? len : 0; + std::vector<octave_value> slice_data (tlen); + auto beg = data.begin () + offset; + auto end = beg + len; + std::copy (beg, end, slice_data.begin ()); + + octave_value_list retval = slice_data; if (tags && len > 0 && names.numel () > 0) - retval.names = names.linear_slice (offset, std::min (offset + len, - names.numel ())); + retval.names = names.linear_slice (offset, std::min (offset + len, names.numel ())); return retval; } @@ -147,16 +177,16 @@ void make_storable_values (void); - octave_value& xelem (octave_idx_type i) { return data.xelem (i); } + octave_value& xelem (octave_idx_type i) { return data[i]; } void clear (void) { data.clear (); } private: - Array<octave_value> data; + std::vector<octave_value> data; - // This list of strings can be used to tag each element of data with a name. - // By default, it is empty. + // This list of strings can be used to tag each element of data with + // a name. By default, it is empty. string_vector names; octave_value& elem (octave_idx_type n) @@ -164,11 +194,10 @@ if (n >= length ()) resize (n + 1); - return data(n); + return data[n]; } - const octave_value& elem (octave_idx_type n) const - { return data(n); } + const octave_value& elem (octave_idx_type n) const { return data[n]; } };