## Copyright (C) 2025
##
## 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
## <https://www.gnu.org/licenses/>.

## -*- texinfo -*-
## @deftypefn {} {@var{s} =} saveobj (@var{tbl})
## Prepare table @var{tbl} for saving to .mat file.
##
## This function is called automatically when saving a table to ensure
## the table type is preserved when loading.
##
## @seealso{loadobj, save, load}
## @end deftypefn

function s = saveobj (tbl)
  if (! istable (tbl))
    error ("saveobj: input must be a table");
  endif

  ## Create a structure that preserves table identity
  s = struct ();
  
  ## Copy all data fields
  fnames = fieldnames (tbl);
  for i = 1:numel (fnames)
    fname = fnames{i};
    if (! strcmp (fname, "Properties"))
      s.(fname) = tbl.(fname);
    endif
  endfor
  
  ## Preserve Properties structure
  s.Properties = tbl.Properties;
  
  ## Add marker to identify as table
  s.__table_marker__ = true;
  s.__table_class__ = "table";
endfunction

