changeset 31468:777a42ebe45b

use opaque pointer for octave_legacy_range data member * ov-legacy-range.h: Use forward declaration of Range class. (octave_legacy_range::m_range): Use std::unique_ptr<Range> to hide details of Range type. Change all uses. * ov-legacy-range.h, ov-legacy-range.cc: Include Range.h in .cc file instead of .h file. (octave_legacy_range::octave_legacy_range): Define custom copy construtor instead of using default.
author John W. Eaton <jwe@octave.org>
date Thu, 17 Nov 2022 13:48:20 -0500
parents dfe3deff7dbe
children fb77a0b4a00a
files libinterp/octave-value/ov-legacy-range.cc libinterp/octave-value/ov-legacy-range.h
diffstat 2 files changed, 30 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/octave-value/ov-legacy-range.cc	Thu Nov 17 13:41:49 2022 -0500
+++ b/libinterp/octave-value/ov-legacy-range.cc	Thu Nov 17 13:48:20 2022 -0500
@@ -31,6 +31,7 @@
 #include <ostream>
 #include <sstream>
 
+#include "Range.h"
 #include "lo-ieee.h"
 #include "lo-utils.h"
 
@@ -57,15 +58,21 @@
 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_legacy_range, "range", "double");
 
 octave_legacy_range::octave_legacy_range (void)
-  : octave_base_value (), m_range () { }
+  : octave_base_value (), m_range (new Range ()) { }
 
 octave_legacy_range::octave_legacy_range (const Range& r)
-  : octave_base_value (), m_range (r)
+  : octave_base_value (), m_range (new Range (r))
 {
-  if (m_range.numel () < 0 && m_range.numel () != -2)
+  if (m_range->numel () < 0 && m_range->numel () != -2)
     error ("invalid range");
 }
 
+octave_legacy_range::octave_legacy_range (const octave_legacy_range& r)
+  : octave_base_value (r), m_range ()
+{
+  m_range.reset (new Range (*(r.m_range)));
+}
+
 static octave_base_value *
 default_numeric_conversion_function (const octave_base_value& a)
 {
@@ -86,10 +93,10 @@
 {
   octave_base_value *retval = nullptr;
 
-  switch (m_range.numel ())
+  switch (m_range->numel ())
     {
     case 1:
-      retval = new octave_scalar (m_range.base ());
+      retval = new octave_scalar (m_range->base ());
       break;
 
     case 0:
@@ -97,17 +104,17 @@
       break;
 
     case -2:
-      retval = new octave_matrix (m_range.matrix_value ());
+      retval = new octave_matrix (m_range->matrix_value ());
       break;
 
     default:
       {
-        if (m_range.increment () == 0)
-          retval = new octave_matrix (m_range.matrix_value ());
+        if (m_range->increment () == 0)
+          retval = new octave_matrix (m_range->matrix_value ());
         else
           retval = new octave_range
-            (octave::range<double> (m_range.base (), m_range.increment (),
-                                    m_range.limit (), m_range.numel ()));
+            (octave::range<double> (m_range->base (), m_range->increment (),
+                                    m_range->limit (), m_range->numel ()));
       }
       break;
     }
@@ -145,9 +152,9 @@
     error ("load: failed to load range constant");
 
   if (inc != 0)
-    m_range = Range (base, limit, inc);
+    m_range.reset (new Range (base, limit, inc));
   else
-    m_range = Range (base, inc, static_cast<octave_idx_type> (limit));
+    m_range.reset (new Range (base, inc, static_cast<octave_idx_type> (limit)));
 
   return true;
 }
@@ -173,9 +180,9 @@
   if (swap)
     swap_bytes<8> (&inc);
   if (inc != 0)
-    m_range = Range (bas, lim, inc);
+    m_range.reset (new Range (bas, lim, inc));
   else
-    m_range = Range (bas, inc, static_cast<octave_idx_type> (lim));
+    m_range.reset (new Range (bas, inc, static_cast<octave_idx_type> (lim)));
 
   return true;
 }
@@ -245,14 +252,14 @@
       octave_idx_type nel;
       if (hdf5_get_scalar_attr (data_hid, H5T_NATIVE_IDX,
                                 "OCTAVE_RANGE_NELEM", &nel))
-        m_range = Range (rangevals[0], rangevals[2], nel);
+        m_range.reset (new Range (rangevals[0], rangevals[2], nel));
       else
         {
           if (rangevals[2] != 0)
-            m_range = Range (rangevals[0], rangevals[1], rangevals[2]);
+            m_range.reset (new Range (rangevals[0], rangevals[1], rangevals[2]));
           else
-            m_range = Range (rangevals[0], rangevals[2],
-                             static_cast<octave_idx_type> (rangevals[1]));
+            m_range.reset (new Range (rangevals[0], rangevals[2],
+                                      static_cast<octave_idx_type> (rangevals[1])));
         }
     }
 
--- a/libinterp/octave-value/ov-legacy-range.h	Thu Nov 17 13:41:49 2022 -0500
+++ b/libinterp/octave-value/ov-legacy-range.h	Thu Nov 17 13:48:20 2022 -0500
@@ -31,10 +31,9 @@
 #include <cstdlib>
 
 #include <iosfwd>
+#include <memory>
 #include <string>
 
-#include "Range.h"
-
 #include "lo-mappers.h"
 #include "lo-utils.h"
 #include "mx-base.h"
@@ -45,6 +44,8 @@
 #include "ov-re-mat.h"
 #include "ov-typeinfo.h"
 
+class Range;
+
 class octave_value_list;
 
 // Legacy Range values.
@@ -65,7 +66,7 @@
 
   octave_legacy_range (const Range& r);
 
-  octave_legacy_range (const octave_legacy_range& r) = default;
+  octave_legacy_range (const octave_legacy_range& r);
 
   // No assignment.
 
@@ -102,7 +103,7 @@
 
 private:
 
-  Range m_range;
+  std::unique_ptr<Range> m_range;
 
   DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA
 };