changeset 21335:e078d2208d86

avoid warnings about implicit float to booll conversions * oct-stream.cc (is_old_NA, replace_old_NA): New templates and specializations. (convert_and_copy): Use them. Move check for do_NA_conv outside of loop.
author John W. Eaton <jwe@octave.org>
date Wed, 24 Feb 2016 12:06:15 -0500
parents 36e75e013849
children 0dcc99afc25b
files libinterp/corefcn/oct-stream.cc
diffstat 1 files changed, 65 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/oct-stream.cc	Wed Feb 24 11:25:12 2016 -0500
+++ b/libinterp/corefcn/oct-stream.cc	Wed Feb 24 12:06:15 2016 -0500
@@ -3101,6 +3101,36 @@
     rep->close ();
 }
 
+// FIXME: maybe these should be defined in lo-ieee.h?
+
+template <typename T>
+static inline bool
+is_old_NA (T)
+{
+  return false;
+}
+
+template <>
+inline bool
+is_old_NA<double> (double val)
+{
+  return __lo_ieee_is_old_NA (val);
+}
+
+template <typename T>
+static inline T
+replace_old_NA (T val)
+{
+  return val;
+}
+
+template <>
+inline double
+replace_old_NA<double> (double val)
+{
+  return __lo_ieee_replace_old_NA (val);
+}
+
 template <typename SRC_T, typename DST_T>
 static octave_value
 convert_and_copy (std::list<void *>& input_buf_list,
@@ -3125,22 +3155,40 @@
 
       if (swap || do_float_fmt_conv)
         {
-          for (octave_idx_type i = 0; i < input_buf_elts && j < elts_read;
-               i++, j++)
+          if (do_NA_conv)
             {
-              if (swap)
-                swap_bytes<sizeof (SRC_T)> (&data[i]);
-              else if (do_float_fmt_conv)
-                do_float_format_conversion (&data[i], sizeof (SRC_T),
-                                            1, from_flt_fmt,
-                                            oct_mach_info::native_float_format ());
-
-              dst_elt_type tmp (data[i]);
-
-              if (do_NA_conv && __lo_ieee_is_old_NA (tmp))
-                tmp = __lo_ieee_replace_old_NA (tmp);
-
-              conv_data[j] = tmp;
+              for (octave_idx_type i = 0; i < input_buf_elts && j < elts_read;
+                   i++, j++)
+                {
+                  if (swap)
+                    swap_bytes<sizeof (SRC_T)> (&data[i]);
+                  else if (do_float_fmt_conv)
+                    do_float_format_conversion (&data[i], sizeof (SRC_T),
+                                                1, from_flt_fmt,
+                                                oct_mach_info::native_float_format ());
+
+                  dst_elt_type tmp (data[i]);
+
+                  if (is_old_NA (tmp))
+                    tmp = replace_old_NA (tmp);
+
+                  conv_data[j] = tmp;
+                }
+            }
+          else
+            {
+              for (octave_idx_type i = 0; i < input_buf_elts && j < elts_read;
+                   i++, j++)
+                {
+                  if (swap)
+                    swap_bytes<sizeof (SRC_T)> (&data[i]);
+                  else if (do_float_fmt_conv)
+                    do_float_format_conversion (&data[i], sizeof (SRC_T),
+                                                1, from_flt_fmt,
+                                                oct_mach_info::native_float_format ());
+
+                  conv_data[j] = data[i];
+                }
             }
         }
       else
@@ -3152,8 +3200,8 @@
                 {
                   dst_elt_type tmp (data[i]);
 
-                  if (__lo_ieee_is_old_NA (tmp))
-                    tmp = __lo_ieee_replace_old_NA (tmp);
+                  if (is_old_NA (tmp))
+                    tmp = replace_old_NA (tmp);
 
                   conv_data[j] = tmp;
                 }