From 14632595315a4d0c2e1ef7986d6c482ba7e2e714 Mon Sep 17 00:00:00 2001
From: Michael Innerberger <michael.innerberger@asc.tuwien.ac.at>
Date: Tue, 8 Aug 2023 16:38:10 -0400
Subject: [PATCH] Consolidate some of the printing functionality

---
 lib/storage/@LevelData/LevelData.m   | 66 ++++++++++++----------------
 lib/storage/@LevelData/printHeader.m |  7 +--
 lib/storage/@LevelData/printLevel.m  | 12 +++--
 lib/storage/@LevelData/saveToTable.m | 20 ++++-----
 4 files changed, 42 insertions(+), 63 deletions(-)

diff --git a/lib/storage/@LevelData/LevelData.m b/lib/storage/@LevelData/LevelData.m
index 1be398c..04c3ec1 100644
--- a/lib/storage/@LevelData/LevelData.m
+++ b/lib/storage/@LevelData/LevelData.m
@@ -34,13 +34,6 @@ classdef LevelData < handle
         timeVariable (1,:) cell
     end
 
-    properties (Access=private)
-        % Separator for printing to command line
-        separator
-        % Minimal width of variables for printing in command line
-        minimalWidth = 8;
-    end
-
     properties (Dependent)
         % Path to folder for file storage
         foldername (1,:) char
@@ -67,10 +60,6 @@ classdef LevelData < handle
     properties (Dependent, Access=private)
         % Boolean vector determining whether variable is a scalar value
         isScalar (1,:) logical
-        % String specifying output format in printLevel
-        formatSpecifier (1,:) char
-        % String specifying header format in printLevel
-        headerSpecifier (1,:) char
     end
 
     methods
@@ -197,32 +186,6 @@ classdef LevelData < handle
             bool = (obj.nLevel <= 1);
         end
 
-        function spec = get.headerSpecifier(obj)
-            % Creates formatting string for the header of the output
-            % to command line
-            spec = '';
-            for j = 1:obj.nScalarVariable
-                t = obj.type.(obj.scalarVariable{j});
-                if j < obj.nScalarVariable
-                    spec = [spec, '%', obj.getWidth(t), 's', obj.separator]; %#ok<*AGROW>
-                else
-                    spec = [spec, '%', obj.getWidth(t), 's\n'];
-                end
-            end
-        end
-
-        function spec = get.formatSpecifier(obj)
-            % Creates formatting string for printing to command line
-            spec = '';
-            for j = 1:obj.nScalarVariable
-                t = obj.type.(obj.scalarVariable{j});
-                if j < obj.nScalarVariable
-                    spec = [spec, '%', obj.getWidth(t), t.type, obj.separator];
-                else
-                    spec = [spec, '%', obj.getWidth(t), t.type, '\n'];
-                end
-            end
-        end
 
         %% READ LEVEL DATA
         data = get(obj, jLevel, variableName)
@@ -307,8 +270,33 @@ classdef LevelData < handle
             [~, idx] = ismember(variableName, obj.label);
         end
 
-        function width = getWidth(obj, type)
-            width = num2str(max(type.width, obj.minimalWidth));
+        function width = getWidth(~, type)
+            minimalWidth = 8;
+            width = num2str(max(type.width, minimalWidth));
+        end
+
+        function spec = getHeaderSpecifier(obj, separator)
+            % Creates formatting string for the header of the output to command line
+            spec = '';
+            for j = 1:obj.nScalarVariable
+                if j == obj.nScalarVariable
+                    separator = '\n';
+                end
+                t = obj.type.(obj.scalarVariable{j});
+                spec = [spec, '%', obj.getWidth(t), 's', separator];
+            end
+        end
+
+        function spec = getFormatSpecifier(obj, separator)
+            % Creates formatting string for printing to command line
+            spec = '';
+            for j = 1:obj.nScalarVariable
+                if j == obj.nScalarVariable
+                    separator = '\n';
+                end
+                t = obj.type.(obj.scalarVariable{j});
+                spec = [spec, '%', obj.getWidth(t), t.type, separator];
+            end
         end
 
         ax = plotLevel(obj, plotFunction, xVariable, variableName)
diff --git a/lib/storage/@LevelData/printHeader.m b/lib/storage/@LevelData/printHeader.m
index d4da24d..3888afc 100644
--- a/lib/storage/@LevelData/printHeader.m
+++ b/lib/storage/@LevelData/printHeader.m
@@ -20,12 +20,9 @@ function printHeader(obj)
 % along with this program.  If not, see <http://www.gnu.org/licenses/>.
 %
 
-
-    % Set separator variable
-    obj.separator = '  ';
-
     % Create header with variable names
-    header = sprintf(obj.headerSpecifier, obj.scalarVariable{:});
+    specifier = obj.getHeaderSpecifier('  ');
+    header = sprintf(specifier, obj.scalarVariable{:});
 
     % Print header to command line
     fprintf(header);
diff --git a/lib/storage/@LevelData/printLevel.m b/lib/storage/@LevelData/printLevel.m
index b600c86..110e49f 100644
--- a/lib/storage/@LevelData/printLevel.m
+++ b/lib/storage/@LevelData/printLevel.m
@@ -21,9 +21,9 @@ function printLevel(obj, jLevel)
 % along with this program.  If not, see <http://www.gnu.org/licenses/>.
 %
 
-    % Print current level by default
-    if nargin < 2
-        jLevel = obj.nLevel;
+    arguments
+        obj
+        jLevel (1,:) double = obj.nLevel
     end
 
     % Print header in case of plotting the first level
@@ -31,10 +31,8 @@ function printLevel(obj, jLevel)
         obj.printHeader();
     end
 
-    % Set separator variable
-    obj.separator = '  ';
-
     % Iterate over given list of levels
+    specifier = obj.getFormatSpecifier('  ');
     for k = 1:length(jLevel)
         % Extract data of all variables
         data = cell(obj.nVariable, 1);
@@ -46,6 +44,6 @@ function printLevel(obj, jLevel)
             end
         end
         % Print information on current level to command line
-        fprintf(obj.formatSpecifier, data{1:ind});
+        fprintf(specifier, data{1:ind});
     end
 end
diff --git a/lib/storage/@LevelData/saveToTable.m b/lib/storage/@LevelData/saveToTable.m
index 8ac9fc8..7527c78 100644
--- a/lib/storage/@LevelData/saveToTable.m
+++ b/lib/storage/@LevelData/saveToTable.m
@@ -21,32 +21,28 @@ function saveToTable(obj, separator)
 % along with this program.  If not, see <http://www.gnu.org/licenses/>.
 %
 
-
-    % Proceed optional input
-    if nargin < 2
-        obj.separator = ',';
-    else
-        obj.separator = separator;
+    arguments
+        obj
+        separator {mustBeTextScalar} = ','
     end
 
-    % Create problem- and method-specific folder
-    ensureFolderExists(obj.foldername);
-
     % Open file
+    ensureFolderExists(obj.foldername);
     fid = fopen(obj.foldername + '/' + obj.filename + '.csv', 'w');
 
     % Save header to file
-    fprintf(fid, obj.headerSpecifier, obj.scalarVariable{:});
+    specifier = obj.getHeaderSpecifier(separator);
+    fprintf(fid, specifier, obj.scalarVariable{:});
 
     % Save information on each level to file
+    specifier = obj.getFormatSpecifier(separator);
     for k = 1:obj.nLevel
         data = cell(obj.nScalarVariable, 1);
         for j = 1:obj.nScalarVariable
             data{j} = obj.level(k).(obj.scalarVariable{j});
         end
-        fprintf(fid, obj.formatSpecifier, data{:});
+        fprintf(fid, specifier, data{:});
     end
 
-    % Close file
     fclose(fid);
 end
-- 
GitLab