From 479145028ad42112d94e62d2c7cec3aa9bc5f7b0 Mon Sep 17 00:00:00 2001
From: Tobias Meisel <tobias.meisel@ufz.de>
Date: Fri, 9 Oct 2020 12:24:44 +0200
Subject: [PATCH] [PL/MeL] Introduce enum for different file formats

---
 ProcessLib/Output/CreateOutput.cpp  | 29 ++++++-----
 ProcessLib/Output/Output.cpp        | 77 ++++++++++++++---------------
 ProcessLib/Output/Output.h          |  4 +-
 ProcessLib/Output/ProcessOutput.cpp | 10 ++--
 ProcessLib/Output/ProcessOutput.h   |  9 +++-
 5 files changed, 70 insertions(+), 59 deletions(-)

diff --git a/ProcessLib/Output/CreateOutput.cpp b/ProcessLib/Output/CreateOutput.cpp
index f0681235cbf..c8723549fdd 100644
--- a/ProcessLib/Output/CreateOutput.cpp
+++ b/ProcessLib/Output/CreateOutput.cpp
@@ -21,7 +21,6 @@
 #include "MeshLib/Mesh.h"
 
 #include "Output.h"
-#include <algorithm>
 
 namespace ProcessLib
 {
@@ -32,17 +31,23 @@ std::unique_ptr<Output> createOutput(
 {
     DBUG("Parse output configuration:");
 
-    //! \ogs_file_param{prj__time_loop__output__type}
-    auto const type = config.getConfigParameter<std::string>("type");
-    constexpr std::array data_formats =  { "VTK", "XDMF" };
-    auto format_is_allowed = std::any_of(data_formats.cbegin(), data_formats.cend(),
-        [&type](std::string i ){ return i == type; });
-    if (!format_is_allowed)
+    OutputTypes const output_type = [](auto type)
     {
-        OGS_FATAL("No supported file type provided. Read `{:s}' from <output><type> \
-                    in prj File. Supported: VTK, XDMF.",
-                    type);
-    }
+        try
+        {
+
+            const std::map<std::string, OutputTypes> outputType_to_enum=
+                {{"VTK",OutputTypes::vtk}, {"XDMF", OutputTypes::xdmf}};
+            return outputType_to_enum.at(type);
+        }
+        catch (std::out_of_range& e)
+        {
+            OGS_FATAL("No supported file type provided. Read `{:s}' from <output><type> \
+                in prj File. Supported: VTK, XDMF.",
+                type);
+        }
+    //! \ogs_file_param{prj__time_loop__output__type}
+    }(config.getConfigParameter<std::string>("type"));
 
     auto const prefix =
         //! \ogs_file_param{prj__time_loop__output__prefix}
@@ -153,7 +158,7 @@ std::unique_ptr<Output> createOutput(
         config.getConfigParameter<bool>("output_iteration_results", false);
 
     return std::make_unique<Output>(
-        output_directory, type, prefix, suffix, compress_output, data_mode,
+        output_directory, output_type, prefix, suffix, compress_output, data_mode,
         output_iteration_results, std::move(repeats_each_steps),
         std::move(fixed_output_times), std::move(output_data_specification),
         std::move(mesh_names_for_output), meshes);
diff --git a/ProcessLib/Output/Output.cpp b/ProcessLib/Output/Output.cpp
index 7dd1179bc6e..9fa5bd779d7 100644
--- a/ProcessLib/Output/Output.cpp
+++ b/ProcessLib/Output/Output.cpp
@@ -11,9 +11,9 @@
 #include "Output.h"
 
 #include <cassert>
+#include <exception>
 #include <fstream>
 #include <vector>
-#include <exception>
 
 #include "Applications/InSituLib/Adaptor.h"
 #include "BaseLib/Logging.h"
@@ -95,10 +95,9 @@ bool Output::shallDoOutput(int timestep, double const t)
     return false;
 }
 
-Output::Output(std::string output_directory, std::string output_file_type,
-               std::string output_file_prefix,
-               std::string output_file_suffix, bool const compress_output,
-               std::string const& data_mode,
+Output::Output(std::string output_directory, OutputTypes output_file_type,
+               std::string output_file_prefix, std::string output_file_suffix,
+               bool const compress_output, std::string const& data_mode,
                bool const output_nonlinear_iteration_results,
                std::vector<PairRepeatEachSteps> repeats_each_steps,
                std::vector<double>&& fixed_output_times,
@@ -106,7 +105,7 @@ Output::Output(std::string output_directory, std::string output_file_type,
                std::vector<std::string>&& mesh_names_for_output,
                std::vector<std::unique_ptr<MeshLib::Mesh>> const& meshes)
     : _output_directory(std::move(output_directory)),
-      _output_file_type(std::move(output_file_type)),
+      _output_file_type(output_file_type),
       _output_file_prefix(std::move(output_file_prefix)),
       _output_file_suffix(std::move(output_file_suffix)),
       _output_file_compression(compress_output),
@@ -182,68 +181,68 @@ MeshLib::IO::PVDFile* Output::findPVDFile(
 
 struct Output::OutputFile
 {
-    OutputFile(std::string const& directory, std::string const& type,
-                std::string const& prefix,
-                std::string const& suffix, std::string const& mesh_name,
-                int const process_id, int const timestep, double const t,
-                int const data_mode_, bool const compression_):
-        name(constructFilename(type, prefix, suffix, mesh_name, process_id,
-                               timestep, t)),
-        path(BaseLib::joinPaths(directory, name)),
-        type(type),
-        data_mode(data_mode_),
-        compression(compression_)
+    OutputFile(std::string const& directory, OutputTypes const type,
+               std::string const& prefix, std::string const& suffix,
+               std::string const& mesh_name, int const process_id,
+               int const timestep, double const t, int const data_mode_,
+               bool const compression_)
+        : name(constructFilename(type, prefix, suffix, mesh_name, process_id,
+                                 timestep, t)),
+          path(BaseLib::joinPaths(directory, name)),
+          type(type),
+          data_mode(data_mode_),
+          compression(compression_)
     {
     }
 
     std::string const name;
     std::string const path;
+    OutputTypes const type;
     //! Chooses vtk's data mode for output following the enumeration given
     /// in the vtkXMLWriter: {Ascii, Binary, Appended}.  See vtkXMLWriter
     /// documentation
     /// http://www.vtk.org/doc/nightly/html/classvtkXMLWriter.html
-    std::string const type;
     int const data_mode;
 
     //! Enables or disables zlib-compression of the output files.
     bool const compression;
 
-    static std::string constructFilename(std::string type, std::string prefix,
-                                         std::string suffix, std::string mesh_name,
-                                         int process_id, int timestep, double t)
+    static std::string constructFilename(OutputTypes type, std::string prefix,
+                                         std::string suffix,
+                                         std::string mesh_name, int process_id,
+                                         int timestep, double t)
     {
-        std::map<std::string, std::string> filetype_to_extension =
-        {{"VTK", "vtu"}, {"XDMF", "xdmf"}   };
+        std::map<OutputTypes, std::string> filetype_to_extension = {
+            {OutputTypes::vtk, "vtu"}, {OutputTypes::xdmf, "xdmf"}};
 
         try
         {
             std::string extension = filetype_to_extension.at(type);
-            std::string name =  BaseLib::constructFormattedFileName(prefix, mesh_name,
-                                                        process_id, timestep, t) +
-                    BaseLib::constructFormattedFileName(suffix, mesh_name,
-                                                        process_id, timestep, t) +
-                    "." +
-                    extension;
+            std::string name = BaseLib::constructFormattedFileName(
+                                   prefix, mesh_name, process_id, timestep, t) +
+                               BaseLib::constructFormattedFileName(
+                                   suffix, mesh_name, process_id, timestep, t) +
+                               "." + extension;
             return name;
         }
         catch (std::out_of_range& e)
         {
-            OGS_FATAL("No supported file type provided. Read  `{:s}' from <output><type> \
+            OGS_FATAL(
+                "No supported file type provided. Read  `{:s}' from <output><type> \
                     in prj file. Supported: VTK, XDMF.",
-                    type);
+                type);
         }
-
     }
 };
 
 void Output::outputMesh(OutputFile const& output_file,
-                            MeshLib::IO::PVDFile* const pvd_file,
-                            MeshLib::Mesh const& mesh,
-                            double const t) const
+                        MeshLib::IO::PVDFile* const pvd_file,
+                        MeshLib::Mesh const& mesh,
+                        double const t) const
 {
     DBUG("output to {:s}", output_file.path);
 
-    if (output_file.type == "VTK")
+    if (output_file.type == OutputTypes::vtk)
     {
         pvd_file->addVTUFile(output_file.name, t);
     }
@@ -297,11 +296,11 @@ void Output::doOutputAlways(Process const& process,
                        _output_file_compression);
 
         MeshLib::IO::PVDFile* pvd_file = nullptr;
-        if (_output_file_type=="VTK")
+        if (_output_file_type == ProcessLib::OutputTypes::vtk)
         {
-            pvd_file= findPVDFile(process, process_id, mesh.getName());
+            pvd_file = findPVDFile(process, process_id, mesh.getName());
         }
-        outputMesh(file, pvd_file, mesh, t );
+        outputMesh(file, pvd_file, mesh, t);
     };
 
     for (auto const& mesh_output_name : _mesh_names_for_output)
diff --git a/ProcessLib/Output/Output.h b/ProcessLib/Output/Output.h
index 3c796332f83..907189d01f2 100644
--- a/ProcessLib/Output/Output.h
+++ b/ProcessLib/Output/Output.h
@@ -37,7 +37,7 @@ public:
     };
 
 public:
-    Output(std::string output_directory, std::string type,
+    Output(std::string output_directory, OutputTypes type,
            std::string prefix, std::string suffix,
            bool const compress_output, std::string const& data_mode,
            bool const output_nonlinear_iteration_results,
@@ -88,7 +88,7 @@ private:
                         double const t) const;
 private:
     std::string const _output_directory;
-    std::string const _output_file_type;
+    OutputTypes const _output_file_type;
     std::string const _output_file_prefix;
     std::string const _output_file_suffix;
 
diff --git a/ProcessLib/Output/ProcessOutput.cpp b/ProcessLib/Output/ProcessOutput.cpp
index c0413ee49b6..9d5727a3657 100644
--- a/ProcessLib/Output/ProcessOutput.cpp
+++ b/ProcessLib/Output/ProcessOutput.cpp
@@ -251,7 +251,8 @@ void addProcessDataToMesh(
 }
 
 void makeOutput(std::string const& file_name, MeshLib::Mesh const& mesh,
-                bool const compress_output, int const data_mode, std::string const& file_type)
+                bool const compress_output, int const data_mode,
+                OutputTypes file_type)
 {
     // Write output file
     DBUG("Writing output to '{:s}'.", file_name);
@@ -269,12 +270,13 @@ void makeOutput(std::string const& file_name, MeshLib::Mesh const& mesh,
 #endif  //_WIN32
 #endif  //__APPLE__
 
-    if (file_type=="VTK")
+    if (file_type == OutputTypes::vtk)
     {
-        MeshLib::IO::VtuInterface vtu_interface(&mesh, data_mode, compress_output);
+        MeshLib::IO::VtuInterface vtu_interface(&mesh, data_mode,
+                                                compress_output);
         vtu_interface.writeToFile(file_name);
     }
-    else if (file_type=="XDMF")
+    else if (file_type == OutputTypes::xdmf)
     {
         MeshLib::IO::writeXdmf3(mesh, file_name);
     }
diff --git a/ProcessLib/Output/ProcessOutput.h b/ProcessLib/Output/ProcessOutput.h
index 688480c2e3a..b75a0111e7c 100644
--- a/ProcessLib/Output/ProcessOutput.h
+++ b/ProcessLib/Output/ProcessOutput.h
@@ -42,11 +42,16 @@ void addProcessDataToMesh(
         integration_point_writer,
     OutputDataSpecification const& output_data_specification);
 
-//! Writes output to the given \c file_name using the VTU file format.
+//! Writes output to the given \c file_name using the specified file format.
 ///
 /// See Output::_output_file_data_mode documentation for the data_mode
 /// parameter.
+enum class OutputTypes : uint8_t
+{
+    vtk,
+    xdmf
+};
 void makeOutput(std::string const& file_name, MeshLib::Mesh const& mesh,
                 bool const compress_output, int const data_mode,
-                std::string const& file_type);
+                OutputTypes const file_type);
 }  // namespace ProcessLib
-- 
GitLab