# HG changeset patch # User John W. Eaton # Date 1566380978 14400 # Wed Aug 21 05:49:38 2019 -0400 # Node ID 7593c4ac149c5a6408b54d2da2a19dc96ec5c481 # Parent 8aa544cc2e170b391523b5d111b385b9d3cb9571 don't use inheritance to define string_vector class Instead of deriving string_vecctor from Array, keep the Array object as a data member of string_vector. Currentyl, we only provide the Array functions that are needed for Octave. We may consider adding others if they are needed by Octave Forge or other functions. * str-vec.h, str-vec.cc (class string_vector): Don't inherit Array. (string_vector::m_data): New data member. Change all functions to use internal data member instead of inherited object. (string_vector::numel, string_vector::isempty, string_vector::elem, string_vector::xelem, string_vector::operator (), string_vector::linear_slice, string_vector::map): New functions. diff --git a/liboctave/util/str-vec.cc b/liboctave/util/str-vec.cc --- a/liboctave/util/str-vec.cc +++ b/liboctave/util/str-vec.cc @@ -42,7 +42,7 @@ 90, 91, 95, 1996 Free Software Foundatio // Create a string vector from a NULL terminated list of C strings. string_vector::string_vector (const char * const *s) - : Array () + : m_data () { octave_idx_type n = 0; @@ -64,7 +64,7 @@ string_vector::string_vector (const char // nonnegative. string_vector::string_vector (const char * const *s, octave_idx_type n) - : Array (dim_vector (n, 1)) + : m_data (dim_vector (n, 1)) { for (octave_idx_type i = 0; i < n; i++) elem (i) = s[i]; @@ -75,7 +75,7 @@ string_vector::sort (bool make_uniq) { // Don't use Array::sort () to allow sorting in place. octave_sort lsort; - lsort.sort (Array::fortran_vec (), numel ()); + lsort.sort (m_data.fortran_vec (), numel ()); if (make_uniq) uniq (); diff --git a/liboctave/util/str-vec.h b/liboctave/util/str-vec.h --- a/liboctave/util/str-vec.h +++ b/liboctave/util/str-vec.h @@ -33,22 +33,19 @@ along with Octave; see the file COPYING. class OCTAVE_API -string_vector : public Array +string_vector { public: - string_vector (void) : Array () { } + string_vector (void) : m_data () { } - explicit string_vector (octave_idx_type n) - : Array (dim_vector (n, 1)) { } + explicit string_vector (octave_idx_type n) : m_data (dim_vector (n, 1)) { } - string_vector (const char *s) - : Array (dim_vector (1, 1), s) { } + string_vector (const char *s) : m_data (dim_vector (1, 1), s) { } - string_vector (const std::string& s) - : Array (dim_vector (1, 1), s) { } + string_vector (const std::string& s) : m_data (dim_vector (1, 1), s) { } - string_vector (const string_vector& s) : Array (s) { } + string_vector (const string_vector& s) : m_data (s.m_data) { } //! Constructor for STL containers of std::string. //! @@ -60,7 +57,7 @@ public: string_vector (const String_Container& lst); string_vector (const Array& s) - : Array (s.as_column ()) { } + : m_data (s.as_column ()) { } string_vector (const char * const *s); @@ -69,7 +66,7 @@ public: string_vector& operator = (const string_vector& s) { if (this != &s) - Array::operator = (s); + m_data = s.m_data; return *this; } @@ -96,18 +93,28 @@ public: void resize (octave_idx_type n, const std::string& rfv = "") { - Array::resize (dim_vector (n, 1), rfv); + m_data.resize (dim_vector (n, 1), rfv); } - std::string& operator[] (octave_idx_type i) - { - return Array::elem (i); - } + octave_idx_type numel (void) const { return m_data.numel (); } + + bool isempty (void) const { return m_data.isempty (); } + + std::string& elem (octave_idx_type i) { return m_data.elem (i); } + + std::string elem (octave_idx_type i) const { return m_data.elem (i); } + + std::string& xelem (octave_idx_type i) { return m_data.xelem (i); } - std::string operator[] (octave_idx_type i) const - { - return Array::elem (i); - } + std::string xelem (octave_idx_type i) const { return m_data.xelem (i); } + + std::string& operator[] (octave_idx_type i) { return elem (i); } + + std::string operator[] (octave_idx_type i) const { return elem (i); } + + std::string& operator () (octave_idx_type i) { return elem (i); } + + std::string operator () (octave_idx_type i) const { return elem (i); } string_vector& sort (bool make_uniq = false); @@ -128,19 +135,33 @@ public: std::ostream& list_in_columns (std::ostream&, int width = 0, const std::string& prefix = "") const; + + string_vector linear_slice (octave_idx_type lo, octave_idx_type up) const + { + return string_vector (m_data.linear_slice (lo, up)); + } + + template Array map (F fcn) const + { + return m_data.map (fcn); + } + +private: + + Array m_data; }; template