From a5d55a7c42e3a008f353aa66814e479564efe3a9 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Wed, 19 Jun 2019 15:53:59 +0200
Subject: [PATCH] Remove pout() and perr()

Actually it seems better (at least for now) to use std::cout,
std::cerr,... since people are used to it.

Default writing processor is processor 0. One will have to use a mechanism to
overload this rule en eventually to allow output into files (reading MPI
options)
---
 src/language/PugsParser.cpp         | 21 +++----
 src/main.cpp                        | 33 +++++------
 src/mesh/Connectivity.hpp           |  6 +-
 src/mesh/ConnectivityComputer.cpp   |  9 ++-
 src/mesh/ConnectivityDispatcher.cpp |  5 +-
 src/mesh/GmshReader.cpp             | 88 +++++++++++++++--------------
 src/mesh/ItemValue.hpp              |  1 -
 src/mesh/ItemValueUtils.hpp         |  8 ++-
 src/mesh/MeshNodeBoundary.hpp       | 12 ++--
 src/mesh/Synchronizer.hpp           |  3 +-
 src/mesh/SynchronizerManager.cpp    |  2 +-
 src/output/VTKWriter.hpp            | 10 ++--
 src/scheme/AcousticSolver.hpp       |  8 ++-
 src/utils/CMakeLists.txt            |  1 -
 src/utils/CastArray.hpp             |  2 +
 src/utils/ConsoleManager.cpp        |  7 +--
 src/utils/FPEManager.cpp            | 13 ++---
 src/utils/Messenger.cpp             |  8 ++-
 src/utils/Messenger.hpp             |  3 +-
 src/utils/Partitioner.cpp           |  7 +--
 src/utils/PugsOStream.cpp           | 13 -----
 src/utils/PugsOStream.hpp           | 46 ---------------
 src/utils/PugsUtils.cpp             | 51 +++++++++--------
 src/utils/SignalManager.cpp         | 14 +++--
 24 files changed, 167 insertions(+), 204 deletions(-)
 delete mode 100644 src/utils/PugsOStream.cpp
 delete mode 100644 src/utils/PugsOStream.hpp

diff --git a/src/language/PugsParser.cpp b/src/language/PugsParser.cpp
index ae98aecdf..6efab91fb 100644
--- a/src/language/PugsParser.cpp
+++ b/src/language/PugsParser.cpp
@@ -1,6 +1,7 @@
-#include <PugsOStream.hpp>
 #include <PugsParser.hpp>
 
+#include <iostream>
+
 #include <rang.hpp>
 
 #include <pegtl.hpp>
@@ -159,10 +160,10 @@ parser(const std::string& filename)
 
   const size_t grammar_issues = analyze<language::grammar>();
 
-  pout() << rang::fgB::yellow << "grammar_issues=" << rang::fg::reset << grammar_issues << '\n';
+  std::cout << rang::fgB::yellow << "grammar_issues=" << rang::fg::reset << grammar_issues << '\n';
 
-  pout() << rang::style::bold << "Parsing file " << rang::style::reset << rang::style::underline << filename
-         << rang::style::reset << " ...\n\n";
+  std::cout << rang::style::bold << "Parsing file " << rang::style::reset << rang::style::underline << filename
+            << rang::style::reset << " ...\n\n";
 
   read_input in(filename);
   try {
@@ -172,13 +173,13 @@ parser(const std::string& filename)
   }
   catch (const parse_error& e) {
     const auto p = e.positions.front();
-    perr() << rang::style::bold << p.source << ':' << p.line << ':' << p.byte_in_line << ": " << rang::style::reset
-           << rang::fgB::red << "error: " << rang::fg::reset << rang::style::bold << e.what() << rang::style::reset
-           << '\n'
-           << in.line_at(p) << '\n'
-           << std::string(p.byte_in_line, ' ') << rang::fgB::yellow << '^' << rang::fg::reset << std::endl;
+    std::cerr << rang::style::bold << p.source << ':' << p.line << ':' << p.byte_in_line << ": " << rang::style::reset
+              << rang::fgB::red << "error: " << rang::fg::reset << rang::style::bold << e.what() << rang::style::reset
+              << '\n'
+              << in.line_at(p) << '\n'
+              << std::string(p.byte_in_line, ' ') << rang::fgB::yellow << '^' << rang::fg::reset << std::endl;
     std::exit(1);
   }
 
-  pout() << "Parsed:\n" << name << std::endl;
+  std::cout << "Parsed:\n" << name << std::endl;
 }
diff --git a/src/main.cpp b/src/main.cpp
index a08658afe..93ff1e39f 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,4 +1,3 @@
-#include <PugsOStream.hpp>
 #include <PugsUtils.hpp>
 
 #include <rang.hpp>
@@ -25,6 +24,8 @@
 
 #include <SynchronizerManager.hpp>
 
+#include <iostream>
+
 #include <limits>
 #include <map>
 #include <regex>
@@ -45,7 +46,7 @@ main(int argc, char* argv[])
   SynchronizerManager::create();
 
   if (filename != "") {
-    pout() << "Reading (gmsh) " << rang::style::underline << filename << rang::style::reset << " ...\n";
+    std::cout << "Reading (gmsh) " << rang::style::underline << filename << rang::style::reset << " ...\n";
     Timer gmsh_timer;
     gmsh_timer.reset();
     GmshReader gmsh_reader(filename);
@@ -99,7 +100,7 @@ main(int argc, char* argv[])
             break;
           }
           default: {
-            perr() << "Unknown BCDescription\n";
+            std::cerr << "Unknown BCDescription\n";
             std::exit(1);
           }
           }
@@ -157,8 +158,8 @@ main(int argc, char* argv[])
                         NamedItemValue{"node_owner", mesh.connectivity().nodeOwner()}},
                        t, true);   // forces last output
 
-      pout() << "* " << rang::style::underline << "Final time" << rang::style::reset << ":  " << rang::fgB::green << t
-             << rang::fg::reset << " (" << iteration << " iterations)\n";
+      std::cout << "* " << rang::style::underline << "Final time" << rang::style::reset << ":  " << rang::fgB::green
+                << t << rang::fg::reset << " (" << iteration << " iterations)\n";
 
       method_cost_map["AcousticSolverWithMesh"] = timer.seconds();
 
@@ -219,7 +220,7 @@ main(int argc, char* argv[])
             break;
           }
           default: {
-            perr() << "Unknown BCDescription\n";
+            std::cerr << "Unknown BCDescription\n";
             std::exit(1);
           }
           }
@@ -275,8 +276,8 @@ main(int argc, char* argv[])
                         NamedItemValue{"node_owner", mesh.connectivity().nodeOwner()}},
                        t, true);   // forces last output
 
-      pout() << "* " << rang::style::underline << "Final time" << rang::style::reset << ":  " << rang::fgB::green << t
-             << rang::fg::reset << " (" << iteration << " iterations)\n";
+      std::cout << "* " << rang::style::underline << "Final time" << rang::style::reset << ":  " << rang::fgB::green
+                << t << rang::fg::reset << " (" << iteration << " iterations)\n";
 
       method_cost_map["AcousticSolverWithMesh"] = timer.seconds();
       break;
@@ -326,7 +327,7 @@ main(int argc, char* argv[])
             break;
           }
           default: {
-            perr() << "Unknown BCDescription\n";
+            std::cerr << "Unknown BCDescription\n";
             std::exit(1);
           }
           }
@@ -381,19 +382,19 @@ main(int argc, char* argv[])
                         NamedItemValue{"node_owner", mesh.connectivity().nodeOwner()}},
                        t, true);   // forces last output
 
-      pout() << "* " << rang::style::underline << "Final time" << rang::style::reset << ":  " << rang::fgB::green << t
-             << rang::fg::reset << " (" << iteration << " iterations)\n";
+      std::cout << "* " << rang::style::underline << "Final time" << rang::style::reset << ":  " << rang::fgB::green
+                << t << rang::fg::reset << " (" << iteration << " iterations)\n";
 
       method_cost_map["AcousticSolverWithMesh"] = timer.seconds();
       break;
     }
     }
 
-    pout() << "* " << rang::fgB::red << "Could not be uglier!" << rang::fg::reset << " (" << __FILE__ << ':' << __LINE__
-           << ")\n";
+    std::cout << "* " << rang::fgB::red << "Could not be uglier!" << rang::fg::reset << " (" << __FILE__ << ':'
+              << __LINE__ << ")\n";
 
   } else {
-    perr() << "Connectivity1D defined by number of nodes no more implemented\n";
+    std::cerr << "Connectivity1D defined by number of nodes no more implemented\n";
     std::exit(0);
   }
 
@@ -407,8 +408,8 @@ main(int argc, char* argv[])
   }
 
   for (const auto& method_cost : method_cost_map) {
-    pout() << "* [" << rang::fgB::cyan << std::setw(size) << std::left << method_cost.first << rang::fg::reset
-           << "] Execution time: " << rang::style::bold << method_cost.second << rang::style::reset << '\n';
+    std::cout << "* [" << rang::fgB::cyan << std::setw(size) << std::left << method_cost.first << rang::fg::reset
+              << "] Execution time: " << rang::style::bold << method_cost.second << rang::style::reset << '\n';
   }
 
   return 0;
diff --git a/src/mesh/Connectivity.hpp b/src/mesh/Connectivity.hpp
index 1b815cdd0..6b7e31a40 100644
--- a/src/mesh/Connectivity.hpp
+++ b/src/mesh/Connectivity.hpp
@@ -4,7 +4,6 @@
 #include <PugsAssert.hpp>
 #include <PugsMacros.hpp>
 
-#include <PugsOStream.hpp>
 #include <PugsUtils.hpp>
 
 #include <PugsTraits.hpp>
@@ -34,6 +33,7 @@
 
 #include <SynchronizerManager.hpp>
 
+#include <iostream>
 #include <set>
 
 class ConnectivityDescriptor;
@@ -208,7 +208,7 @@ class Connectivity final : public IConnectivity
   const auto&
   edgeOwner() const
   {
-    perr() << __FILE__ << ':' << __LINE__ << ": edge owner not built\n";
+    std::cerr << __FILE__ << ':' << __LINE__ << ": edge owner not built\n";
     std::terminate();
     return m_edge_owner;
   }
@@ -255,7 +255,7 @@ class Connectivity final : public IConnectivity
   const auto&
   edgeIsOwned() const
   {
-    perr() << __FILE__ << ':' << __LINE__ << ": edge is owned not built\n";
+    std::cerr << __FILE__ << ':' << __LINE__ << ": edge is owned not built\n";
     std::terminate();
     return m_edge_is_owned;
   }
diff --git a/src/mesh/ConnectivityComputer.cpp b/src/mesh/ConnectivityComputer.cpp
index b040c4889..b4f24fb69 100644
--- a/src/mesh/ConnectivityComputer.cpp
+++ b/src/mesh/ConnectivityComputer.cpp
@@ -1,6 +1,8 @@
 #include <Connectivity.hpp>
 
 #include <ConnectivityComputer.hpp>
+
+#include <iostream>
 #include <map>
 
 template <typename ConnectivityType>
@@ -13,11 +15,12 @@ ConnectivityComputer::computeConnectivityMatrix(const ConnectivityType& connecti
   if (connectivity.isConnectivityMatrixBuilt(child_item_type, item_type)) {
     const ConnectivityMatrix& child_to_item_matrix = connectivity._getMatrix(child_item_type, item_type);
 
-    pout() << "computing connectivity " << itemName(item_type) << " -> " << itemName(child_item_type) << '\n';
+    std::cout << "computing connectivity " << itemName(item_type) << " -> " << itemName(child_item_type) << '\n';
 
     item_to_child_item_matrix = this->_computeInverse(child_to_item_matrix);
   } else {
-    perr() << "unable to compute connectivity " << itemName(item_type) << " -> " << itemName(child_item_type) << '\n';
+    std::cerr << "unable to compute connectivity " << itemName(item_type) << " -> " << itemName(child_item_type)
+              << '\n';
     std::terminate();
   }
 
@@ -53,7 +56,7 @@ ConnectivityComputer::_computeInverse(const ConnectivityMatrix& item_to_child_ma
     size_t i = 0;
     for (const auto& [child_item_id, item_vector] : child_to_item_vector_map) {
       if (child_item_id != i) {
-        perr() << "sparse item numerotation NIY\n";
+        std::cerr << "sparse item numerotation NIY\n";
         std::exit(0);
       }
       ++i;
diff --git a/src/mesh/ConnectivityDispatcher.cpp b/src/mesh/ConnectivityDispatcher.cpp
index 792bb0c18..0136c264c 100644
--- a/src/mesh/ConnectivityDispatcher.cpp
+++ b/src/mesh/ConnectivityDispatcher.cpp
@@ -3,6 +3,7 @@
 
 #include <ItemOfItemType.hpp>
 
+#include <iostream>
 #include <unordered_map>
 
 template <int Dimension>
@@ -417,8 +418,8 @@ ConnectivityDispatcher<Dimension>::_buildItemReferenceList()
 
   if (number_of_item_list_sender > 0) {
     if (number_of_item_list_sender > 1) {
-      perr() << __FILE__ << ':' << __LINE__ << ": " << rang::fgB::red
-             << "need to check that knowing procs know the same item_ref_lists!" << rang::fg::reset << '\n';
+      std::cerr << __FILE__ << ':' << __LINE__ << ": " << rang::fgB::red
+                << "need to check that knowing procs know the same item_ref_lists!" << rang::fg::reset << '\n';
     }
 
     if (number_of_item_list_sender < parallel::size()) {
diff --git a/src/mesh/GmshReader.cpp b/src/mesh/GmshReader.cpp
index 3d2c7985b..7ba1dbfc1 100644
--- a/src/mesh/GmshReader.cpp
+++ b/src/mesh/GmshReader.cpp
@@ -21,6 +21,8 @@
 #include <ConnectivityDispatcher.hpp>
 
 #include <iomanip>
+#include <iostream>
+
 #include <map>
 #include <regex>
 #include <unordered_map>
@@ -88,30 +90,30 @@ ErrorHandler::writeErrorMessage() const
 {
   switch (__type) {
   case asked: {
-    perr() << "\nremark: exit command explicitly called\n";
+    std::cerr << "\nremark: exit command explicitly called\n";
     [[fallthrough]];
   }
   case normal: {
-    perr() << '\n' << __filename << ':' << __lineNumber << ":remark: emitted the following message\n";
-    perr() << "error: " << __errorMessage << '\n';
+    std::cerr << '\n' << __filename << ':' << __lineNumber << ":remark: emitted the following message\n";
+    std::cerr << "error: " << __errorMessage << '\n';
     break;
   }
   case compilation: {
-    perr() << "\nline " << __lineNumber << ':' << __errorMessage << '\n';
+    std::cerr << "\nline " << __lineNumber << ':' << __errorMessage << '\n';
     break;
   }
   case unexpected: {
-    perr() << '\n' << __filename << ':' << __lineNumber << ":\n" << __errorMessage << '\n';
-    perr() << "\nUNEXPECTED ERROR: this should not occure, please report it\n";
-    perr() << "\nBUG REPORT: Please send bug reports to:\n"
-           << "  ff3d-dev@nongnu.org or freefem@ann.jussieu.fr\n"
-           << "or better, use the Bug Tracking System:\n"
-           << "  http://savannah.nongnu.org/bugs/?group=ff3d\n";
+    std::cerr << '\n' << __filename << ':' << __lineNumber << ":\n" << __errorMessage << '\n';
+    std::cerr << "\nUNEXPECTED ERROR: this should not occure, please report it\n";
+    std::cerr << "\nBUG REPORT: Please send bug reports to:\n"
+              << "  ff3d-dev@nongnu.org or freefem@ann.jussieu.fr\n"
+              << "or better, use the Bug Tracking System:\n"
+              << "  http://savannah.nongnu.org/bugs/?group=ff3d\n";
     break;
   }
   default: {
-    perr() << __filename << ':' << __lineNumber << ": " << __errorMessage << '\n';
-    perr() << __FILE__ << ':' << __LINE__ << ":remark:  error type not implemented!\n";
+    std::cerr << __filename << ':' << __lineNumber << ": " << __errorMessage << '\n';
+    std::cerr << __FILE__ << ':' << __LINE__ << ":remark:  error type not implemented!\n";
   }
   }
 }
@@ -343,7 +345,7 @@ GmshReader::GmshReader(const std::string& filename) : m_filename(filename)
     try {
       m_fin.open(m_filename);
       if (not m_fin) {
-        perr() << "cannot read file '" << m_filename << "'\n";
+        std::cerr << "cannot read file '" << m_filename << "'\n";
         std::exit(0);
       }
 
@@ -405,7 +407,7 @@ GmshReader::GmshReader(const std::string& filename) : m_filename(filename)
       __primitivesNames[14]     = "point";
       __supportedPrimitives[14] = true;
 
-      pout() << "Reading file '" << m_filename << "'\n";
+      std::cout << "Reading file '" << m_filename << "'\n";
 
       // Getting vertices list
       GmshReader::Keyword kw = this->__nextKeyword();
@@ -453,18 +455,18 @@ GmshReader::GmshReader(const std::string& filename) : m_filename(filename)
           // 	}
           // }
 
-          //       pout() << "- Binary format: ";
+          //       std::cout << "- Binary format: ";
           // #ifdef    WORDS_BIGENDIAN
           //       if (not __convertEndian) {
-          // 	pout() << "big endian\n";
+          // 	std::cout << "big endian\n";
           //       } else {
-          // 	pout() << "little endian\n";
+          // 	std::cout << "little endian\n";
           //       }
           // #else  // WORDS_BIGENDIAN
           //       if (not __convertEndian) {
-          // 	pout() << "little endian\n";
+          // 	std::cout << "little endian\n";
           //       } else {
-          // 	pout() << "big endian\n";
+          // 	std::cout << "big endian\n";
           //       }
           // #endif // WORDS_BIGENDIAN
         }
@@ -495,9 +497,9 @@ GmshReader::GmshReader(const std::string& filename) : m_filename(filename)
       std::exit(0);
     }
   }
-  pout() << std::flush;
+  std::cout << std::flush;
   if (parallel::size() > 1) {
-    pout() << "Sequential mesh read! Need to be dispatched\n" << std::flush;
+    std::cout << "Sequential mesh read! Need to be dispatched\n" << std::flush;
 
     const int mesh_dimension = [&]() {
       int mesh_dimension = -1;   // unknown mesh dimension
@@ -534,7 +536,7 @@ GmshReader::GmshReader(const std::string& filename) : m_filename(filename)
       break;
     }
     default: {
-      perr() << "unexpected dimension " << mesh_dimension << '\n';
+      std::cerr << "unexpected dimension " << mesh_dimension << '\n';
       std::exit(1);
     }
     }
@@ -545,7 +547,7 @@ void
 GmshReader::__readVertices()
 {
   const int numberOfVerices = this->_getInteger();
-  pout() << "- Number Of Vertices: " << numberOfVerices << '\n';
+  std::cout << "- Number Of Vertices: " << numberOfVerices << '\n';
   if (numberOfVerices < 0) {
     throw ErrorHandler(__FILE__, __LINE__, "reading file '" + this->m_filename + "': number of vertices is negative",
                        ErrorHandler::normal);
@@ -590,7 +592,7 @@ GmshReader::__readVertices()
 // GmshReader::__readElements1()
 // {
 //   const int numberOfElements = this->_getInteger();
-//   pout() << "- Number Of Elements: " << numberOfElements << '\n';
+//   std::cout << "- Number Of Elements: " << numberOfElements << '\n';
 //   if (numberOfElements<0) {
 //     throw ErrorHandler(__FILE__,__LINE__,
 // 		       "reading file '"+m_filename
@@ -639,7 +641,7 @@ void
 GmshReader::__readElements2_2()
 {
   const int numberOfElements = this->_getInteger();
-  pout() << "- Number Of Elements: " << numberOfElements << '\n';
+  std::cout << "- Number Of Elements: " << numberOfElements << '\n';
   if (numberOfElements < 0) {
     throw ErrorHandler(__FILE__, __LINE__, "reading file '" + m_filename + "': number of elements is negative",
                        ErrorHandler::normal);
@@ -754,8 +756,8 @@ GmshReader::__readPhysicalNames2_2()
     PhysicalRefId physical_ref_id(physical_dimension, RefId(physical_number, physical_name));
     auto searched_physical_ref_id = m_physical_ref_map.find(physical_number);
     if (searched_physical_ref_id != m_physical_ref_map.end()) {
-      perr() << "Physical reference id '" << physical_ref_id << "' already defined as '"
-             << searched_physical_ref_id->second << "'!";
+      std::cerr << "Physical reference id '" << physical_ref_id << "' already defined as '"
+                << searched_physical_ref_id->second << "'!";
       std::exit(0);
     }
     m_physical_ref_map[physical_number] = physical_ref_id;
@@ -813,7 +815,7 @@ GmshReader::__computeCellFaceAndFaceNodeConnectivities(ConnectivityDescriptor& d
         break;
       }
       default: {
-        perr() << name(descriptor.cell_type_vector[j]) << ": unexpected cell type in dimension 2!\n";
+        std::cerr << name(descriptor.cell_type_vector[j]) << ": unexpected cell type in dimension 2!\n";
         std::terminate();
       }
       }
@@ -867,7 +869,7 @@ GmshReader::__computeCellFaceAndFaceNodeConnectivities(ConnectivityDescriptor& d
         break;
       }
       default: {
-        perr() << name(descriptor.cell_type_vector[j]) << ": unexpected cell type in dimension 3!\n";
+        std::cerr << name(descriptor.cell_type_vector[j]) << ": unexpected cell type in dimension 3!\n";
         std::terminate();
       }
       }
@@ -1040,7 +1042,7 @@ GmshReader::__computeFaceEdgeAndEdgeNodeAndCellEdgeConnectivities(ConnectivityDe
         break;
       }
       default: {
-        perr() << name(descriptor.cell_type_vector[j]) << ": unexpected cell type in dimension 3!\n";
+        std::cerr << name(descriptor.cell_type_vector[j]) << ": unexpected cell type in dimension 3!\n";
         std::terminate();
       }
       }
@@ -1062,16 +1064,16 @@ GmshReader::__proceedData()
 
   for (size_t i = 0; i < elementNumber.dimension(); ++i) {
     if (elementNumber[i] > 0) {
-      pout() << "  - Number of " << __primitivesNames[i] << ": " << elementNumber[i];
+      std::cout << "  - Number of " << __primitivesNames[i] << ": " << elementNumber[i];
       if (not(__supportedPrimitives[i])) {
-        pout() << " [" << rang::fg::yellow << "IGNORED" << rang::style::reset << "]";
+        std::cout << " [" << rang::fg::yellow << "IGNORED" << rang::style::reset << "]";
       } else {
-        pout() << " references: ";
+        std::cout << " references: ";
         for (std::set<size_t>::const_iterator iref = elementReferences[i].begin(); iref != elementReferences[i].end();
              ++iref) {
           if (iref != elementReferences[i].begin())
-            pout() << ',';
-          pout() << *iref;
+            std::cout << ',';
+          std::cout << *iref;
         }
 
         switch (i) {
@@ -1129,11 +1131,11 @@ GmshReader::__proceedData()
         }
         }
       }
-      pout() << '\n';
+      std::cout << '\n';
     }
   }
 
-  pout() << "- Building correspondance table\n";
+  std::cout << "- Building correspondance table\n";
   int minNumber = std::numeric_limits<int>::max();
   int maxNumber = std::numeric_limits<int>::min();
   for (size_t i = 0; i < __verticesNumbers.size(); ++i) {
@@ -1307,10 +1309,10 @@ GmshReader::__proceedData()
   dimension3_mask[12]                 = 1;
   dimension3_mask[13]                 = 1;
 
-  pout() << "- dimension 0 entities: " << (dimension0_mask, elementNumber) << '\n';
-  pout() << "- dimension 1 entities: " << (dimension1_mask, elementNumber) << '\n';
-  pout() << "- dimension 2 entities: " << (dimension2_mask, elementNumber) << '\n';
-  pout() << "- dimension 3 entities: " << (dimension3_mask, elementNumber) << '\n';
+  std::cout << "- dimension 0 entities: " << (dimension0_mask, elementNumber) << '\n';
+  std::cout << "- dimension 1 entities: " << (dimension1_mask, elementNumber) << '\n';
+  std::cout << "- dimension 2 entities: " << (dimension2_mask, elementNumber) << '\n';
+  std::cout << "- dimension 3 entities: " << (dimension3_mask, elementNumber) << '\n';
   if ((dimension3_mask, elementNumber) > 0) {
     const size_t nb_cells = (dimension3_mask, elementNumber);
 
@@ -1776,7 +1778,7 @@ GmshReader::__proceedData()
     m_mesh = std::make_shared<MeshType>(p_connectivity, xr);
 
   } else {
-    perr() << "*** using a dimension 0 mesh is forbidden!\n";
+    std::cerr << "*** using a dimension 0 mesh is forbidden!\n";
     std::exit(0);
   }
 }
@@ -1812,7 +1814,7 @@ GmshReader::__nextKeyword()
 void
 GmshReader::__readGmshFormat2_2()
 {
-  pout() << "- Reading Gmsh format 2.2\n";
+  std::cout << "- Reading Gmsh format 2.2\n";
   GmshReader::Keyword kw = std::make_pair("", Unknown);
   while (kw.second != EndOfFile) {
     kw = this->__nextKeyword();
diff --git a/src/mesh/ItemValue.hpp b/src/mesh/ItemValue.hpp
index 38b53ea79..81301f7a3 100644
--- a/src/mesh/ItemValue.hpp
+++ b/src/mesh/ItemValue.hpp
@@ -2,7 +2,6 @@
 #define ITEM_VALUE_HPP
 
 #include <PugsAssert.hpp>
-#include <PugsOStream.hpp>
 
 #include <Array.hpp>
 
diff --git a/src/mesh/ItemValueUtils.hpp b/src/mesh/ItemValueUtils.hpp
index 33a4a988a..666d4a0e9 100644
--- a/src/mesh/ItemValueUtils.hpp
+++ b/src/mesh/ItemValueUtils.hpp
@@ -9,6 +9,8 @@
 #include <Synchronizer.hpp>
 #include <SynchronizerManager.hpp>
 
+#include <iostream>
+
 template <typename DataType, ItemType item_type>
 std::remove_const_t<DataType>
 min(const ItemValue<DataType, item_type>& item_value)
@@ -37,7 +39,7 @@ min(const ItemValue<DataType, item_type>& item_value)
       break;
     }
     default: {
-      perr() << __FILE__ << ':' << __LINE__ << ": unexpected dimension\n";
+      std::cerr << __FILE__ << ':' << __LINE__ << ": unexpected dimension\n";
       std::terminate();
     }
     }
@@ -128,7 +130,7 @@ max(const ItemValue<DataType, item_type>& item_value)
       break;
     }
     default: {
-      perr() << __FILE__ << ':' << __LINE__ << ": unexpected dimension\n";
+      std::cerr << __FILE__ << ':' << __LINE__ << ": unexpected dimension\n";
       std::terminate();
     }
     }
@@ -219,7 +221,7 @@ sum(const ItemValue<DataType, item_type>& item_value)
       break;
     }
     default: {
-      perr() << __FILE__ << ':' << __LINE__ << ": unexpected dimension\n";
+      std::cerr << __FILE__ << ':' << __LINE__ << ": unexpected dimension\n";
       std::terminate();
     }
     }
diff --git a/src/mesh/MeshNodeBoundary.hpp b/src/mesh/MeshNodeBoundary.hpp
index 5742d0c5d..5c5de47d4 100644
--- a/src/mesh/MeshNodeBoundary.hpp
+++ b/src/mesh/MeshNodeBoundary.hpp
@@ -15,6 +15,8 @@
 
 #include <Messenger.hpp>
 
+#include <iostream>
+
 template <size_t Dimension>
 class MeshNodeBoundary
 {
@@ -42,7 +44,7 @@ class MeshNodeBoundary
       face_list.size(), PUGS_LAMBDA(const int& l) {
         const auto& face_cells = face_to_cell_matrix[face_list[l]];
         if (face_cells.size() > 1) {
-          perr() << "internal faces cannot be used to define mesh boundaries\n";
+          std::cerr << "internal faces cannot be used to define mesh boundaries\n";
           std::exit(1);
         }
       });
@@ -153,7 +155,7 @@ MeshFlatNodeBoundary<2>::_checkBoundaryIsFlat(const TinyVector<2, double>& norma
     m_node_list.size(), PUGS_LAMBDA(const size_t& r) {
       const R2& x = xr[m_node_list[r]];
       if ((x - origin, normal) > 1E-13 * length) {
-        perr() << "this FlatBoundary is not flat!\n";
+        std::cerr << "this FlatBoundary is not flat!\n";
         std::exit(1);
       }
     });
@@ -177,7 +179,7 @@ MeshFlatNodeBoundary<1>::_getNormal(const MeshType& mesh)
   }();
 
   if (number_of_bc_nodes != 1) {
-    perr() << "Node boundaries in 1D require to have exactly 1 node\n";
+    std::cerr << "Node boundaries in 1D require to have exactly 1 node\n";
     std::exit(1);
   }
 
@@ -224,7 +226,7 @@ MeshFlatNodeBoundary<2>::_getNormal(const MeshType& mesh)
   }
 
   if (xmin == xmax) {
-    perr() << "xmin==xmax (" << xmin << "==" << xmax << ") unable to compute normal";
+    std::cerr << "xmin==xmax (" << xmin << "==" << xmax << ") unable to compute normal";
     std::exit(1);
   }
 
@@ -349,7 +351,7 @@ MeshFlatNodeBoundary<3>::_getNormal(const MeshType& mesh)
   }
 
   if (normal_l2 == 0) {
-    perr() << "not able to compute normal!\n";
+    std::cerr << "not able to compute normal!\n";
     std::exit(1);
   }
 
diff --git a/src/mesh/Synchronizer.hpp b/src/mesh/Synchronizer.hpp
index 30781a63a..7c2f97a6c 100644
--- a/src/mesh/Synchronizer.hpp
+++ b/src/mesh/Synchronizer.hpp
@@ -4,6 +4,7 @@
 #include <Connectivity.hpp>
 #include <ItemValue.hpp>
 
+#include <iostream>
 #include <map>
 
 class Synchronizer
@@ -187,7 +188,7 @@ class Synchronizer
       break;
     }
     default: {
-      perr() << __FILE__ << ':' << __LINE__ << ": unexpected dimension\n";
+      std::cerr << __FILE__ << ':' << __LINE__ << ": unexpected dimension\n";
       std::terminate();
     }
     }
diff --git a/src/mesh/SynchronizerManager.cpp b/src/mesh/SynchronizerManager.cpp
index e739394e3..b02ae8300 100644
--- a/src/mesh/SynchronizerManager.cpp
+++ b/src/mesh/SynchronizerManager.cpp
@@ -9,7 +9,7 @@ SynchronizerManager* SynchronizerManager::m_instance{nullptr};
 SynchronizerManager::~SynchronizerManager()
 {
   if (m_connectivity_synchronizer_map.size() > 0) {
-    perr() << __FILE__ << ':' << __LINE__ << ": warning: some connectivities are still registered\n";
+    std::cerr << __FILE__ << ':' << __LINE__ << ": warning: some connectivities are still registered\n";
     ;
   }
 }
diff --git a/src/output/VTKWriter.hpp b/src/output/VTKWriter.hpp
index 4793c1bf2..4656a1839 100644
--- a/src/output/VTKWriter.hpp
+++ b/src/output/VTKWriter.hpp
@@ -3,15 +3,17 @@
 
 #include <IConnectivity.hpp>
 #include <TinyVector.hpp>
-#include <fstream>
-#include <iomanip>
-#include <sstream>
-#include <string>
 
 #include <ItemValue.hpp>
 #include <Messenger.hpp>
 #include <OutputNamedItemValueSet.hpp>
 
+#include <fstream>
+#include <iomanip>
+#include <iostream>
+#include <sstream>
+#include <string>
+
 class VTKWriter
 {
  private:
diff --git a/src/scheme/AcousticSolver.hpp b/src/scheme/AcousticSolver.hpp
index 01b485f5f..24c2e3651 100644
--- a/src/scheme/AcousticSolver.hpp
+++ b/src/scheme/AcousticSolver.hpp
@@ -19,6 +19,8 @@
 #include <Messenger.hpp>
 #include <SubItemValuePerItem.hpp>
 
+#include <iostream>
+
 template <typename MeshData>
 class AcousticSolver
 {
@@ -118,12 +120,12 @@ class AcousticSolver
     for (const auto& handler : m_boundary_condition_list) {
       switch (handler.boundaryCondition().type()) {
       case BoundaryCondition::normal_velocity: {
-        perr() << __FILE__ << ':' << __LINE__ << ": normal_velocity BC NIY\n";
+        std::cerr << __FILE__ << ':' << __LINE__ << ": normal_velocity BC NIY\n";
         std::exit(0);
         break;
       }
       case BoundaryCondition::velocity: {
-        perr() << __FILE__ << ':' << __LINE__ << ": velocity BC NIY\n";
+        std::cerr << __FILE__ << ':' << __LINE__ << ": velocity BC NIY\n";
         std::exit(0);
         break;
       }
@@ -131,7 +133,7 @@ class AcousticSolver
         // const PressureBoundaryCondition& pressure_bc
         //   = dynamic_cast<const
         //   PressureBoundaryCondition&>(handler.boundaryCondition());
-        perr() << __FILE__ << ':' << __LINE__ << ": pressure BC NIY\n";
+        std::cerr << __FILE__ << ':' << __LINE__ << ": pressure BC NIY\n";
         std::exit(0);
         break;
       }
diff --git a/src/utils/CMakeLists.txt b/src/utils/CMakeLists.txt
index 9859671af..59def1c2d 100644
--- a/src/utils/CMakeLists.txt
+++ b/src/utils/CMakeLists.txt
@@ -11,7 +11,6 @@ add_library(
   FPEManager.cpp
   Messenger.cpp
   Partitioner.cpp
-  PugsOStream.cpp
   PugsUtils.cpp
   RevisionInfo.cpp
   SignalManager.cpp)
diff --git a/src/utils/CastArray.hpp b/src/utils/CastArray.hpp
index e9f0cdd07..5202d8862 100644
--- a/src/utils/CastArray.hpp
+++ b/src/utils/CastArray.hpp
@@ -4,6 +4,8 @@
 #include <Array.hpp>
 #include <PugsTraits.hpp>
 
+#include <iostream>
+
 template <typename DataType, typename CastDataType>
 class CastArray
 {
diff --git a/src/utils/ConsoleManager.cpp b/src/utils/ConsoleManager.cpp
index cec3cb2cb..83e4c84cb 100644
--- a/src/utils/ConsoleManager.cpp
+++ b/src/utils/ConsoleManager.cpp
@@ -1,5 +1,4 @@
 #include <ConsoleManager.hpp>
-#include <PugsOStream.hpp>
 
 #include <rang.hpp>
 
@@ -12,12 +11,12 @@ ConsoleManager::isTerminal(std::ostream& os)
 void
 ConsoleManager::init(const bool& colorize)
 {
-  pout() << "Console management: color ";
+  std::cout << "Console management: color ";
   if (colorize) {
     rang::setControlMode(rang::control::Force);
-    pout() << rang::style::bold << rang::fgB::green << "enabled" << rang::fg::reset << rang::style::reset << '\n';
+    std::cout << rang::style::bold << rang::fgB::green << "enabled" << rang::fg::reset << rang::style::reset << '\n';
   } else {
     rang::setControlMode(rang::control::Off);
-    pout() << "disabled\n";
+    std::cout << "disabled\n";
   }
 }
diff --git a/src/utils/FPEManager.cpp b/src/utils/FPEManager.cpp
index 2c61e8920..b0295f77d 100644
--- a/src/utils/FPEManager.cpp
+++ b/src/utils/FPEManager.cpp
@@ -1,6 +1,5 @@
 #include <FPEManager.hpp>
 #include <PugsMacros.hpp>
-#include <PugsOStream.hpp>
 
 #include <pugs_config.hpp>
 #include <rang.hpp>
@@ -62,16 +61,16 @@ fedisableexcept(unsigned int excepts)
 void
 FPEManager::enable()
 {
-  pout() << "FE management: " << rang::style::bold << rang::fgB::green << "enabled" << rang::fg::reset
-         << rang::style::reset << '\n';
+  std::cout << "FE management: " << rang::style::bold << rang::fgB::green << "enabled" << rang::fg::reset
+            << rang::style::reset << '\n';
   ::feenableexcept(MANAGED_FPE);
 }
 
 void
 FPEManager::disable()
 {
-  pout() << "FE management: " << rang::style::bold << rang::fgB::red << "disabled" << rang::fg::reset
-         << rang::style::reset << '\n';
+  std::cout << "FE management: " << rang::style::bold << rang::fgB::red << "disabled" << rang::fg::reset
+            << rang::style::reset << '\n';
   ::fedisableexcept(MANAGED_FPE);
 }
 
@@ -80,13 +79,13 @@ FPEManager::disable()
 void
 FPEManager::enable()
 {
-  pout() << "FE management: enabled " << rang::fg::red << "[not supported]" << rang::fg::reset << '\n';
+  std::cout << "FE management: enabled " << rang::fg::red << "[not supported]" << rang::fg::reset << '\n';
 }
 
 void
 FPEManager::disable()
 {
-  pout() << "FE management: disable " << rang::fg::red << "[not supported]" << rang::fg::reset << '\n';
+  std::cout << "FE management: disable " << rang::fg::red << "[not supported]" << rang::fg::reset << '\n';
 }
 
 #endif   // PUGS_HAS_FENV_H
diff --git a/src/utils/Messenger.cpp b/src/utils/Messenger.cpp
index f1d180535..07eab1792 100644
--- a/src/utils/Messenger.cpp
+++ b/src/utils/Messenger.cpp
@@ -1,5 +1,6 @@
 #include <Messenger.hpp>
-#include <PugsOStream.hpp>
+
+#include <iostream>
 
 namespace parallel
 {
@@ -45,8 +46,9 @@ Messenger::Messenger([[maybe_unused]] int& argc, [[maybe_unused]] char* argv[])
 
   if (m_rank != 0) {
     // LCOV_EXCL_START
-    pout.setOutput(null_stream);
-    perr.setOutput(null_stream);
+    std::cout.setstate(std::ios::badbit);
+    std::cerr.setstate(std::ios::badbit);
+    std::clog.setstate(std::ios::badbit);
     // LCOV_EXCL_STOP
   }
 #endif   // PUGS_HAS_MPI
diff --git a/src/utils/Messenger.hpp b/src/utils/Messenger.hpp
index d697d61cd..d3c3801be 100644
--- a/src/utils/Messenger.hpp
+++ b/src/utils/Messenger.hpp
@@ -3,7 +3,6 @@
 
 #include <PugsAssert.hpp>
 #include <PugsMacros.hpp>
-#include <PugsOStream.hpp>
 
 #include <Array.hpp>
 #include <ArrayUtils.hpp>
@@ -19,6 +18,8 @@
 
 #include <PugsTraits.hpp>
 
+#include <iostream>
+
 namespace parallel
 {
 class Messenger
diff --git a/src/utils/Partitioner.cpp b/src/utils/Partitioner.cpp
index 8d3f46512..4bbee923c 100644
--- a/src/utils/Partitioner.cpp
+++ b/src/utils/Partitioner.cpp
@@ -2,20 +2,19 @@
 #include <Partitioner.hpp>
 #include <pugs_config.hpp>
 
-#include <PugsOStream.hpp>
-
 #ifdef PUGS_HAS_MPI
 
 #define IDXTYPEWIDTH 64
 #define REALTYPEWIDTH 64
 #include <parmetis.h>
 
+#include <iostream>
 #include <vector>
 
 Array<int>
 Partitioner::partition(const CSRGraph& graph)
 {
-  pout() << "Partitioning graph into " << rang::style::bold << parallel::size() << rang::style::reset << " parts\n";
+  std::cout << "Partitioning graph into " << rang::style::bold << parallel::size() << rang::style::reset << " parts\n";
 
   int wgtflag = 0;
   int numflag = 0;
@@ -62,7 +61,7 @@ Partitioner::partition(const CSRGraph& graph)
       ParMETIS_V3_PartKway(&(vtxdist[0]), &(entries[0]), &(neighbors[0]), NULL, NULL, &wgtflag, &numflag, &ncon, &npart,
                            &(tpwgts[0]), &(ubvec[0]), &(options[0]), &edgecut, &(part[0]), &parmetis_comm);
     if (result == METIS_ERROR) {
-      perr() << "Metis Error\n";
+      std::cerr << "Metis Error\n";
       std::exit(1);
     }
 
diff --git a/src/utils/PugsOStream.cpp b/src/utils/PugsOStream.cpp
deleted file mode 100644
index e321f50d7..000000000
--- a/src/utils/PugsOStream.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <PugsOStream.hpp>
-
-#include <iomanip>
-#include <sstream>
-
-PugsOStream pout(std::cout);
-PugsOStream perr(std::cerr);
-
-std::stringstream null_stream;
-const PugsOStream _null_stream_initializer([]() -> std::stringstream& {
-  null_stream.setstate(std::ios::badbit);
-  return null_stream;
-}());
diff --git a/src/utils/PugsOStream.hpp b/src/utils/PugsOStream.hpp
deleted file mode 100644
index e5d986186..000000000
--- a/src/utils/PugsOStream.hpp
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef PUGS_OSTREAM_HPP
-#define PUGS_OSTREAM_HPP
-
-#include <PugsMacros.hpp>
-#include <iostream>
-#include <sstream>
-
-extern std::stringstream null_stream;
-
-class PugsOStream
-{
- private:
-  std::ostream* m_os = nullptr;
-
- public:
-  PUGS_INLINE
-  std::ostream&
-  operator()()
-  {
-    return *m_os;
-  }
-
-  void
-  setOutput(std::ostream& os)
-  {
-    m_os = &os;
-  }
-
-  PugsOStream(std::ostream& os) : m_os(&os)
-  {
-    ;
-  }
-
-  PugsOStream& operator=(const PugsOStream&) = delete;
-  PugsOStream& operator=(PugsOStream&&) = delete;
-  PugsOStream(const PugsOStream&)       = delete;
-  PugsOStream(PugsOStream&&)            = delete;
-
-  ~PugsOStream() = default;
-};
-
-extern PugsOStream pout;
-extern PugsOStream perr;
-extern const PugsOStream _null_stream_initializer;
-
-#endif   // PUGS_OSTREAM_HPP
diff --git a/src/utils/PugsUtils.cpp b/src/utils/PugsUtils.cpp
index 4e77863d3..9aa20750e 100644
--- a/src/utils/PugsUtils.cpp
+++ b/src/utils/PugsUtils.cpp
@@ -1,4 +1,3 @@
-#include <PugsOStream.hpp>
 #include <PugsUtils.hpp>
 
 #include <Kokkos_Core.hpp>
@@ -16,32 +15,34 @@
 
 #include <CLI/CLI.hpp>
 
+#include <iostream>
+
 std::string
 initialize(int& argc, char* argv[])
 {
   parallel::Messenger::create(argc, argv);
 
-  pout() << "Pugs version: " << rang::style::bold << RevisionInfo::version() << rang::style::reset << '\n';
+  std::cout << "Pugs version: " << rang::style::bold << RevisionInfo::version() << rang::style::reset << '\n';
 
-  pout() << "-------------------- " << rang::fg::green << "git info" << rang::fg::reset << " -------------------------"
-         << '\n';
-  pout() << "tag:  " << rang::style::bold << RevisionInfo::gitTag() << rang::style::reset << '\n';
-  pout() << "HEAD: " << rang::style::bold << RevisionInfo::gitHead() << rang::style::reset << '\n';
-  pout() << "hash: " << rang::style::bold << RevisionInfo::gitHash() << rang::style::reset << "  (";
+  std::cout << "-------------------- " << rang::fg::green << "git info" << rang::fg::reset
+            << " -------------------------" << '\n';
+  std::cout << "tag:  " << rang::style::bold << RevisionInfo::gitTag() << rang::style::reset << '\n';
+  std::cout << "HEAD: " << rang::style::bold << RevisionInfo::gitHead() << rang::style::reset << '\n';
+  std::cout << "hash: " << rang::style::bold << RevisionInfo::gitHash() << rang::style::reset << "  (";
 
   if (RevisionInfo::gitIsClean()) {
-    pout() << rang::fgB::green << "clean" << rang::fg::reset;
+    std::cout << rang::fgB::green << "clean" << rang::fg::reset;
   } else {
-    pout() << rang::fgB::red << "dirty" << rang::fg::reset;
+    std::cout << rang::fgB::red << "dirty" << rang::fg::reset;
   }
-  pout() << ")\n";
-  pout() << "-------------------- " << rang::fg::green << "build info" << rang::fg::reset << " -----------------------"
-         << '\n';
-  pout() << "type:     " << rang::style::bold << BuildInfo::type() << rang::style::reset << '\n';
-  pout() << "compiler: " << rang::style::bold << BuildInfo::compiler() << rang::style::reset << '\n';
-  pout() << "kokkos:   " << rang::style::bold << BuildInfo::kokkosDevices() << rang::style::reset << '\n';
-  pout() << "mpi:      " << rang::style::bold << BuildInfo::mpiLibrary() << rang::style::reset << '\n';
-  pout() << "-------------------------------------------------------\n";
+  std::cout << ")\n";
+  std::cout << "-------------------- " << rang::fg::green << "build info" << rang::fg::reset
+            << " -----------------------" << '\n';
+  std::cout << "type:     " << rang::style::bold << BuildInfo::type() << rang::style::reset << '\n';
+  std::cout << "compiler: " << rang::style::bold << BuildInfo::compiler() << rang::style::reset << '\n';
+  std::cout << "kokkos:   " << rang::style::bold << BuildInfo::kokkosDevices() << rang::style::reset << '\n';
+  std::cout << "mpi:      " << rang::style::bold << BuildInfo::mpiLibrary() << rang::style::reset << '\n';
+  std::cout << "-------------------------------------------------------\n";
 
   std::string filename;
   {
@@ -65,13 +66,13 @@ initialize(int& argc, char* argv[])
     bool pause_on_error = false;
     app.add_flag("-p,--pause-on-error", pause_on_error, "Pause for debugging on unexpected error [default: false]");
 
-    std::atexit([]() { pout() << rang::style::reset; });
+    std::atexit([]() { std::cout << rang::style::reset; });
     try {
       app.parse(argc, argv);
     }
     catch (const CLI::ParseError& e) {
       parallel::Messenger::destroy();
-      std::exit(app.exit(e, pout(), perr()));
+      std::exit(app.exit(e, std::cout, std::cerr));
     }
 
     ConsoleManager::init(enable_color);
@@ -81,13 +82,13 @@ initialize(int& argc, char* argv[])
   }
 
   Kokkos::initialize(argc, argv);
-  pout() << "-------------------- " << rang::fg::green << "exec info" << rang::fg::reset << " ------------------------"
-         << '\n';
+  std::cout << "-------------------- " << rang::fg::green << "exec info" << rang::fg::reset
+            << " ------------------------" << '\n';
 
-  pout() << rang::style::bold;
-  Kokkos::DefaultExecutionSpace::print_configuration(pout());
-  pout() << rang::style::reset;
-  pout() << "-------------------------------------------------------\n";
+  std::cout << rang::style::bold;
+  Kokkos::DefaultExecutionSpace::print_configuration(std::cout);
+  std::cout << rang::style::reset;
+  std::cout << "-------------------------------------------------------\n";
 
   return filename;
 }
diff --git a/src/utils/SignalManager.cpp b/src/utils/SignalManager.cpp
index 4fc37443a..c9cf877dc 100644
--- a/src/utils/SignalManager.cpp
+++ b/src/utils/SignalManager.cpp
@@ -1,7 +1,6 @@
 #include <SignalManager.hpp>
 
 #include <PugsAssert.hpp>
-#include <PugsOStream.hpp>
 
 #include <BacktraceManager.hpp>
 #include <ConsoleManager.hpp>
@@ -14,6 +13,8 @@
 
 #include <Messenger.hpp>
 
+#include <iostream>
+
 bool SignalManager::s_pause_on_error = false;
 
 void
@@ -68,6 +69,9 @@ SignalManager::handler(int signal)
   std::signal(SIGINT, SIG_DFL);
   std::signal(SIGABRT, SIG_DFL);
 
+  // Each failing process must write
+  std::cerr.setstate(std::ios::goodbit);
+
   BacktraceManager bm;
   std::cerr << bm << '\n';
 
@@ -101,10 +105,10 @@ SignalManager::init(const bool& enable)
     std::signal(SIGABRT, SignalManager::handler);
     std::signal(SIGPIPE, SignalManager::handler);
 
-    pout() << "Signal management: " << rang::style::bold << rang::fgB::green << "enabled" << rang::fg::reset
-           << rang::style::reset << '\n';
+    std::cout << "Signal management: " << rang::style::bold << rang::fgB::green << "enabled" << rang::fg::reset
+              << rang::style::reset << '\n';
   } else {
-    pout() << "Signal management: " << rang::style::bold << rang::fgB::red << "disabled" << rang::fg::reset
-           << rang::style::reset << '\n';
+    std::cout << "Signal management: " << rang::style::bold << rang::fgB::red << "disabled" << rang::fg::reset
+              << rang::style::reset << '\n';
   }
 }
-- 
GitLab