view libinterp/octave-value/ov-uint32.cc @ 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 092078913d54
children b8cb5a05955e
line wrap: on
line source

/*

Copyright (C) 2004-2017 John W. Eaton

This file is part of Octave.

Octave is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.

Octave is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Octave; see the file COPYING.  If not, see
<http://www.gnu.org/licenses/>.

*/

#if defined (HAVE_CONFIG_H)
#  include "config.h"
#endif

#include <iostream>
#include <limits>

#include "lo-ieee.h"
#include "lo-utils.h"
#include "mx-base.h"
#include "quit.h"

#include "errwarn.h"
#include "oct-lvalue.h"
#include "oct-hdf5.h"
#include "ops.h"
#include "ov-base.h"

#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"
#include "ov-base-int.cc"
#include "ov-uint32.h"
#include "pr-output.h"
#include "variables.h"

#include "byte-swap.h"
#include "ls-oct-text.h"
#include "ls-utils.h"
#include "ls-hdf5.h"

// Prevent implicit instantiations on some systems (Windows, others?)
// that can lead to duplicate definitions of static data members.

extern template class OCTINTERP_API octave_base_scalar<double>;

template class octave_base_matrix<uint32NDArray>;

template class octave_base_int_matrix<uint32NDArray>;

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);
}