changeset 24224:ff81c6772664

avoid issue with link-time optimization With link-time optimization, the value used for the HDF5 save type was not working correctly for Octave int types. It seems that the templated load and save functions were recognized as duplicates and only one version was used, even though they needed to be different. This patch attempts to avoid that. * ov-base-int.h, ov-base-int.cc (octave_base_int<T>::load_hdf5_internal): Rename from octave_base_int<T>::load_hdf5. Pass HDF5 save type as arg. (octave_base_int<T>::save_hdf5_internal): Rename from octave_base_int<T>::save_hdf5. Pass HDF5 save type as arg. * ov-intx.h (OCTAVE_VALUE_INT_MATRIX_T::load_hdf5, OCTAVE_VALUE_INT_MATRIX_T::save_hdf5, OCTAVE_VALUE_INT_SCALAR_T:load_hdf5, OCTAVE_VALUE_INT_SCALAR_T:save_hdf5): New declarations. * ov-int16.cc, ov-int32.cc, ov-int64.cc, ov-int8.cc, ov-uint16.cc, ov-uint32.cc, ov-uint64.cc, ov-uint8.cc: Define load_hdf5 and save_hdf5 functions.
author John W. Eaton <jwe@octave.org>
date Thu, 09 Nov 2017 18:20:19 -0500
parents 629858e122f1
children b8cb5a05955e
files libinterp/octave-value/ov-base-int.cc libinterp/octave-value/ov-base-int.h libinterp/octave-value/ov-int16.cc libinterp/octave-value/ov-int32.cc libinterp/octave-value/ov-int64.cc libinterp/octave-value/ov-int8.cc libinterp/octave-value/ov-intx.h libinterp/octave-value/ov-uint16.cc libinterp/octave-value/ov-uint32.cc libinterp/octave-value/ov-uint64.cc libinterp/octave-value/ov-uint8.cc
diffstat 11 files changed, 268 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/octave-value/ov-base-int.cc	Thu Nov 09 21:07:42 2017 +0100
+++ b/libinterp/octave-value/ov-base-int.cc	Thu Nov 09 18:20:19 2017 -0500
@@ -405,14 +405,15 @@
 
 template <typename T>
 bool
-octave_base_int_matrix<T>::save_hdf5 (octave_hdf5_id loc_id, const char *name,
-                                      bool)
+octave_base_int_matrix<T>::save_hdf5_internal (octave_hdf5_id loc_id,
+                                               octave_hdf5_id save_type,
+                                               const char *name, bool)
 {
   bool retval = false;
 
 #if defined (HAVE_HDF5)
 
-  hid_t save_type_hid = HDF5_SAVE_TYPE;
+  hid_t save_type_hid = save_type;
   dim_vector dv = this->dims ();
   int empty = save_hdf5_empty (loc_id, name, dv);
   if (empty)
@@ -461,13 +462,15 @@
 
 template <typename T>
 bool
-octave_base_int_matrix<T>::load_hdf5 (octave_hdf5_id loc_id, const char *name)
+octave_base_int_matrix<T>::load_hdf5_internal (octave_hdf5_id loc_id,
+                                               octave_hdf5_id save_type,
+                                               const char *name)
 {
   bool retval = false;
 
 #if defined (HAVE_HDF5)
 
-  hid_t save_type_hid = HDF5_SAVE_TYPE;
+  hid_t save_type_hid = save_type;
   dim_vector dv;
   int empty = load_hdf5_empty (loc_id, name, dv);
   if (empty > 0)
@@ -699,14 +702,15 @@
 
 template <typename T>
 bool
-octave_base_int_scalar<T>::save_hdf5 (octave_hdf5_id loc_id, const char *name,
-                                      bool)
+octave_base_int_scalar<T>::save_hdf5_internal (octave_hdf5_id loc_id,
+                                               octave_hdf5_id save_type,
+                                               const char *name, bool)
 {
   bool retval = false;
 
 #if defined (HAVE_HDF5)
 
-  hid_t save_type_hid = HDF5_SAVE_TYPE;
+  hid_t save_type_hid = save_type;
   hsize_t dimens[3];
   hid_t space_hid, data_hid;
   space_hid = data_hid = -1;
@@ -745,11 +749,13 @@
 
 template <typename T>
 bool
-octave_base_int_scalar<T>::load_hdf5 (octave_hdf5_id loc_id, const char *name)
+octave_base_int_scalar<T>::load_hdf5_internal (octave_hdf5_id loc_id,
+                                               octave_hdf5_id save_type,
+                                               const char *name)
 {
 #if defined (HAVE_HDF5)
 
-  hid_t save_type_hid = HDF5_SAVE_TYPE;
+  hid_t save_type_hid = save_type;
 #if defined (HAVE_HDF5_18)
   hid_t data_hid = H5Dopen (loc_id, name, octave_H5P_DEFAULT);
 #else
--- a/libinterp/octave-value/ov-base-int.h	Thu Nov 09 21:07:42 2017 +0100
+++ b/libinterp/octave-value/ov-base-int.h	Thu Nov 09 18:20:19 2017 -0500
@@ -93,9 +93,13 @@
   bool load_binary (std::istream& is, bool swap,
                     octave::mach_info::float_format);
 
-  bool save_hdf5 (octave_hdf5_id loc_id, const char *name, bool);
+protected:
 
-  bool load_hdf5 (octave_hdf5_id loc_id, const char *name);
+  bool save_hdf5_internal (octave_hdf5_id loc_id, octave_hdf5_id save_type,
+                           const char *name, bool);
+
+  bool load_hdf5_internal (octave_hdf5_id loc_id, octave_hdf5_id save_type,
+                           const char *name);
 };
 
 // base int scalar values.
@@ -150,10 +154,13 @@
 
   bool load_binary (std::istream& is, bool swap,
                     octave::mach_info::float_format);
+protected:
 
-  bool save_hdf5 (octave_hdf5_id loc_id, const char *name, bool);
+  bool save_hdf5_internal (octave_hdf5_id loc_id, octave_hdf5_id save_type,
+                           const char *name, bool);
 
-  bool load_hdf5 (octave_hdf5_id loc_id, const char *name);
+  bool load_hdf5_internal (octave_hdf5_id loc_id, octave_hdf5_id save_type,
+                           const char *name);
 };
 
 #endif
--- a/libinterp/octave-value/ov-int16.cc	Thu Nov 09 21:07:42 2017 +0100
+++ b/libinterp/octave-value/ov-int16.cc	Thu Nov 09 18:20:19 2017 -0500
@@ -40,6 +40,9 @@
 
 #if defined (HAVE_HDF5)
 #  define HDF5_SAVE_TYPE H5T_NATIVE_INT16
+#else
+// This value will not be used.
+#  define HDF5_SAVE_TYPE 0
 #endif
 
 #include "ov-base-int.h"
@@ -65,9 +68,36 @@
 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_int16_matrix,
                                      "int16 matrix", "int16");
 
+
+bool
+octave_int16_matrix::save_hdf5 (octave_hdf5_id loc_id, const char *name,
+                                bool flag)
+{
+  return save_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name, flag);
+}
+
+bool
+octave_int16_matrix::load_hdf5 (octave_hdf5_id loc_id, const char *name)
+{
+  return load_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name);
+}
+
 template class octave_base_scalar<octave_int16>;
 
 template class octave_base_int_scalar<octave_int16>;
 
 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_int16_scalar,
                                      "int16 scalar", "int16");
+
+bool
+octave_int16_scalar::save_hdf5 (octave_hdf5_id loc_id, const char *name,
+                                bool flag)
+{
+  return save_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name, flag);
+}
+
+bool
+octave_int16_scalar::load_hdf5 (octave_hdf5_id loc_id, const char *name)
+{
+  return load_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name);
+}
--- a/libinterp/octave-value/ov-int32.cc	Thu Nov 09 21:07:42 2017 +0100
+++ b/libinterp/octave-value/ov-int32.cc	Thu Nov 09 18:20:19 2017 -0500
@@ -40,6 +40,9 @@
 
 #if defined (HAVE_HDF5)
 #  define HDF5_SAVE_TYPE H5T_NATIVE_INT32
+#else
+// This value will not be used.
+#  define HDF5_SAVE_TYPE 0
 #endif
 
 #include "ov-base-int.h"
@@ -64,6 +67,18 @@
 
 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_int32_matrix,
                                      "int32 matrix", "int32");
+bool
+octave_int32_matrix::save_hdf5 (octave_hdf5_id loc_id, const char *name,
+                                bool flag)
+{
+  return save_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name, flag);
+}
+
+bool
+octave_int32_matrix::load_hdf5 (octave_hdf5_id loc_id, const char *name)
+{
+  return load_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name);
+}
 
 template class octave_base_scalar<octave_int32>;
 
@@ -71,3 +86,16 @@
 
 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_int32_scalar,
                                      "int32 scalar", "int32");
+
+bool
+octave_int32_scalar::save_hdf5 (octave_hdf5_id loc_id, const char *name,
+                                bool flag)
+{
+  return save_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name, flag);
+}
+
+bool
+octave_int32_scalar::load_hdf5 (octave_hdf5_id loc_id, const char *name)
+{
+  return load_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name);
+}
--- a/libinterp/octave-value/ov-int64.cc	Thu Nov 09 21:07:42 2017 +0100
+++ b/libinterp/octave-value/ov-int64.cc	Thu Nov 09 18:20:19 2017 -0500
@@ -40,6 +40,9 @@
 
 #if defined (HAVE_HDF5)
 #  define HDF5_SAVE_TYPE H5T_NATIVE_INT64
+#else
+// This value will not be used.
+#  define HDF5_SAVE_TYPE 0
 #endif
 
 #include "ov-base-int.h"
@@ -65,9 +68,35 @@
 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_int64_matrix,
                                      "int64 matrix", "int64");
 
+bool
+octave_int64_matrix::save_hdf5 (octave_hdf5_id loc_id, const char *name,
+                                bool flag)
+{
+  return save_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name, flag);
+}
+
+bool
+octave_int64_matrix::load_hdf5 (octave_hdf5_id loc_id, const char *name)
+{
+  return load_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name);
+}
+
 template class octave_base_scalar<octave_int64>;
 
 template class octave_base_int_scalar<octave_int64>;
 
 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_int64_scalar,
                                      "int64 scalar", "int64");
+
+bool
+octave_int64_scalar::save_hdf5 (octave_hdf5_id loc_id, const char *name,
+                                bool flag)
+{
+  return save_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name, flag);
+}
+
+bool
+octave_int64_scalar::load_hdf5 (octave_hdf5_id loc_id, const char *name)
+{
+  return load_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name);
+}
--- a/libinterp/octave-value/ov-int8.cc	Thu Nov 09 21:07:42 2017 +0100
+++ b/libinterp/octave-value/ov-int8.cc	Thu Nov 09 18:20:19 2017 -0500
@@ -40,6 +40,9 @@
 
 #if defined (HAVE_HDF5)
 #  define HDF5_SAVE_TYPE H5T_NATIVE_INT8
+#else
+// This value will not be used.
+#  define HDF5_SAVE_TYPE 0
 #endif
 
 #include "ov-base-int.h"
@@ -65,9 +68,35 @@
 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_int8_matrix,
                                      "int8 matrix", "int8");
 
+bool
+octave_int8_matrix::save_hdf5 (octave_hdf5_id loc_id, const char *name,
+                               bool flag)
+{
+  return save_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name, flag);
+}
+
+bool
+octave_int8_matrix::load_hdf5 (octave_hdf5_id loc_id, const char *name)
+{
+  return load_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name);
+}
+
 template class octave_base_scalar<octave_int8>;
 
 template class octave_base_int_scalar<octave_int8>;
 
 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_int8_scalar,
                                      "int8 scalar", "int8");
+
+bool
+octave_int8_scalar::save_hdf5 (octave_hdf5_id loc_id, const char *name,
+                               bool flag)
+{
+  return save_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name, flag);
+}
+
+bool
+octave_int8_scalar::load_hdf5 (octave_hdf5_id loc_id, const char *name)
+{
+  return load_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name);
+}
--- a/libinterp/octave-value/ov-intx.h	Thu Nov 09 21:07:42 2017 +0100
+++ b/libinterp/octave-value/ov-intx.h	Thu Nov 09 18:20:19 2017 -0500
@@ -369,6 +369,10 @@
       }
   }
 
+  bool save_hdf5 (octave_hdf5_id loc_id, const char *name, bool flag);
+
+  bool load_hdf5 (octave_hdf5_id loc_id, const char *name);
+
 private:
 
   DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA
@@ -672,7 +676,11 @@
       }
   }
 
-private:
+  bool save_hdf5 (octave_hdf5_id loc_id, const char *name, bool flag);
+
+  bool load_hdf5 (octave_hdf5_id loc_id, const char *name);
+
+ private:
 
   DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA
 };
--- a/libinterp/octave-value/ov-uint16.cc	Thu Nov 09 21:07:42 2017 +0100
+++ b/libinterp/octave-value/ov-uint16.cc	Thu Nov 09 18:20:19 2017 -0500
@@ -41,6 +41,9 @@
 
 #if defined (HAVE_HDF5)
 #  define HDF5_SAVE_TYPE H5T_NATIVE_UINT16
+#else
+// This value will not be used.
+#  define HDF5_SAVE_TYPE 0
 #endif
 
 #include "ov-base-int.h"
@@ -66,9 +69,35 @@
 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_uint16_matrix,
                                      "uint16 matrix", "uint16");
 
+bool
+octave_uint16_matrix::save_hdf5 (octave_hdf5_id loc_id, const char *name,
+                                 bool flag)
+{
+  return save_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name, flag);
+}
+
+bool
+octave_uint16_matrix::load_hdf5 (octave_hdf5_id loc_id, const char *name)
+{
+  return load_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name);
+}
+
 template class octave_base_scalar<octave_uint16>;
 
 template class octave_base_int_scalar<octave_uint16>;
 
 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_uint16_scalar,
                                      "uint16 scalar", "uint16");
+
+bool
+octave_uint16_scalar::save_hdf5 (octave_hdf5_id loc_id, const char *name,
+                                 bool flag)
+{
+  return save_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name, flag);
+}
+
+bool
+octave_uint16_scalar::load_hdf5 (octave_hdf5_id loc_id, const char *name)
+{
+  return load_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name);
+}
--- a/libinterp/octave-value/ov-uint32.cc	Thu Nov 09 21:07:42 2017 +0100
+++ b/libinterp/octave-value/ov-uint32.cc	Thu Nov 09 18:20:19 2017 -0500
@@ -40,6 +40,9 @@
 
 #if defined (HAVE_HDF5)
 #  define HDF5_SAVE_TYPE H5T_NATIVE_UINT32
+#else
+// This value will not be used.
+#  define HDF5_SAVE_TYPE 0
 #endif
 
 #include "ov-base-int.h"
@@ -65,9 +68,35 @@
 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_uint32_matrix,
                                      "uint32 matrix", "uint32");
 
+bool
+octave_uint32_matrix::save_hdf5 (octave_hdf5_id loc_id, const char *name,
+                                 bool flag)
+{
+  return save_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name, flag);
+}
+
+bool
+octave_uint32_matrix::load_hdf5 (octave_hdf5_id loc_id, const char *name)
+{
+  return load_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name);
+}
+
 template class octave_base_scalar<octave_uint32>;
 
 template class octave_base_int_scalar<octave_uint32>;
 
 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_uint32_scalar,
                                      "uint32 scalar", "uint32");
+
+bool
+octave_uint32_scalar::save_hdf5 (octave_hdf5_id loc_id, const char *name,
+                                 bool flag)
+{
+  return save_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name, flag);
+}
+
+bool
+octave_uint32_scalar::load_hdf5 (octave_hdf5_id loc_id, const char *name)
+{
+  return load_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name);
+}
--- a/libinterp/octave-value/ov-uint64.cc	Thu Nov 09 21:07:42 2017 +0100
+++ b/libinterp/octave-value/ov-uint64.cc	Thu Nov 09 18:20:19 2017 -0500
@@ -40,6 +40,9 @@
 
 #if defined (HAVE_HDF5)
 #  define HDF5_SAVE_TYPE H5T_NATIVE_UINT64
+#else
+// This value will not be used.
+#  define HDF5_SAVE_TYPE 0
 #endif
 
 #include "ov-base-int.h"
@@ -65,9 +68,35 @@
 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_uint64_matrix,
                                      "uint64 matrix", "uint64");
 
+bool
+octave_uint64_matrix::save_hdf5 (octave_hdf5_id loc_id, const char *name,
+                                 bool flag)
+{
+  return save_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name, flag);
+}
+
+bool
+octave_uint64_matrix::load_hdf5 (octave_hdf5_id loc_id, const char *name)
+{
+  return load_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name);
+}
+
 template class octave_base_scalar<octave_uint64>;
 
 template class octave_base_int_scalar<octave_uint64>;
 
 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_uint64_scalar,
                                      "uint64 scalar", "uint64");
+
+bool
+octave_uint64_scalar::save_hdf5 (octave_hdf5_id loc_id, const char *name,
+                                 bool flag)
+{
+  return save_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name, flag);
+}
+
+bool
+octave_uint64_scalar::load_hdf5 (octave_hdf5_id loc_id, const char *name)
+{
+  return load_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name);
+}
--- a/libinterp/octave-value/ov-uint8.cc	Thu Nov 09 21:07:42 2017 +0100
+++ b/libinterp/octave-value/ov-uint8.cc	Thu Nov 09 18:20:19 2017 -0500
@@ -40,6 +40,9 @@
 
 #if defined (HAVE_HDF5)
 #  define HDF5_SAVE_TYPE H5T_NATIVE_UINT8
+#else
+// This value will not be used.
+#  define HDF5_SAVE_TYPE 0
 #endif
 
 #include "ov-base-int.h"
@@ -65,9 +68,35 @@
 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_uint8_matrix,
                                      "uint8 matrix", "uint8");
 
+bool
+octave_uint8_matrix::save_hdf5 (octave_hdf5_id loc_id, const char *name,
+                                bool flag)
+{
+  return save_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name, flag);
+}
+
+bool
+octave_uint8_matrix::load_hdf5 (octave_hdf5_id loc_id, const char *name)
+{
+  return load_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name);
+}
+
 template class octave_base_scalar<octave_uint8>;
 
 template class octave_base_int_scalar<octave_uint8>;
 
 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_uint8_scalar,
                                      "uint8 scalar", "uint8");
+
+bool
+octave_uint8_scalar::save_hdf5 (octave_hdf5_id loc_id, const char *name,
+                                bool flag)
+{
+  return save_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name, flag);
+}
+
+bool
+octave_uint8_scalar::load_hdf5 (octave_hdf5_id loc_id, const char *name)
+{
+  return load_hdf5_internal (loc_id, HDF5_SAVE_TYPE, name);
+}