aboutsummaryrefslogtreecommitdiff
path: root/Source/ablastr/utils/text
diff options
context:
space:
mode:
Diffstat (limited to 'Source/ablastr/utils/text')
-rw-r--r--Source/ablastr/utils/text/CMakeLists.txt4
-rw-r--r--Source/ablastr/utils/text/Make.package3
-rw-r--r--Source/ablastr/utils/text/StringUtils.H68
-rw-r--r--Source/ablastr/utils/text/StringUtils.cpp52
4 files changed, 127 insertions, 0 deletions
diff --git a/Source/ablastr/utils/text/CMakeLists.txt b/Source/ablastr/utils/text/CMakeLists.txt
new file mode 100644
index 000000000..516d184b3
--- /dev/null
+++ b/Source/ablastr/utils/text/CMakeLists.txt
@@ -0,0 +1,4 @@
+target_sources(ablastr
+ PRIVATE
+ StringUtils.cpp
+)
diff --git a/Source/ablastr/utils/text/Make.package b/Source/ablastr/utils/text/Make.package
new file mode 100644
index 000000000..1cd8ee593
--- /dev/null
+++ b/Source/ablastr/utils/text/Make.package
@@ -0,0 +1,3 @@
+CEXE_sources += StringUtils.cpp
+
+VPATH_LOCATIONS += $(WARPX_HOME)/Source/ablastr/utils/text
diff --git a/Source/ablastr/utils/text/StringUtils.H b/Source/ablastr/utils/text/StringUtils.H
new file mode 100644
index 000000000..35c280e17
--- /dev/null
+++ b/Source/ablastr/utils/text/StringUtils.H
@@ -0,0 +1,68 @@
+/* Copyright 2022 Andrew Myers, Luca Fedeli, Maxence Thevenet
+ * Revathi Jambunathan
+ *
+ * This file is part of WarpX.
+ *
+ * License: BSD-3-Clause-LBNL
+ */
+
+#ifndef ABLASTR_UTILS_TEXT_STRINGUTILS_H_
+#define ABLASTR_UTILS_TEXT_STRINGUTILS_H_
+
+#include <AMReX_Utility.H>
+
+#include <string>
+#include <vector>
+
+namespace ablastr::utils::text
+{
+ /** \brief Splits a string using a string separator. This is somewhat similar to
+ * amrex::Tokenize. The main difference is that, if the separator ":" is used,
+ * amrex::Tokenize will split ":3::2" into ["3","2"] while this functio will
+ * split ":3::2" into ["","3","","2"]. This function can also perform a trimming to
+ * remove whitespaces (or any other arbitrary string) from the split string.
+ *
+ * @tparam Container the type of the split string.
+ *
+ * @param[in] instr the input string
+ * @param[in] separator the separator string
+ * @param[in] trim true to trim the split string, false otherwise.
+ * @param[in] trim_space the string to trim if trim is true.
+ * @return cont the split string
+ */
+ template <typename Container>
+ auto split_string (std::string const& instr, std::string const& separator,
+ bool const trim = false, std::string const& trim_space = " \t")
+ {
+ Container cont;
+ std::size_t current = instr.find(separator);
+ std::size_t previous = 0;
+ while (current != std::string::npos) {
+ if (trim){
+ cont.push_back(amrex::trim(instr.substr(previous, current - previous),trim_space));}
+ else{
+ cont.push_back(instr.substr(previous, current - previous));}
+ previous = current + separator.size();
+ current = instr.find(separator, previous);
+ }
+ if (trim){
+ cont.push_back(amrex::trim(instr.substr(previous, current - previous),trim_space));}
+ else{
+ cont.push_back(instr.substr(previous, current - previous));}
+ return cont;
+ }
+
+ /** \brief This function performs automatic text wrapping on a string,
+ * returning an array of strings each not exceeding the maximum line length
+ * (unless the text contains a word exceeding the maximum line length).
+ *
+ * @param[in] text the string containing the text to be wrapped
+ * @param[in] max_line_length the maximum line length
+ * @return an std::vector containing the lines of the wrapped text
+ */
+ std::vector<std::string> automatic_text_wrap(
+ const std::string& text, const int max_line_length);
+
+}
+
+#endif // ABLASTR_UTILS_TEXT_STRINGUTILS_H_
diff --git a/Source/ablastr/utils/text/StringUtils.cpp b/Source/ablastr/utils/text/StringUtils.cpp
new file mode 100644
index 000000000..67a269bbb
--- /dev/null
+++ b/Source/ablastr/utils/text/StringUtils.cpp
@@ -0,0 +1,52 @@
+/* Copyright 2022 Andrew Myers, Luca Fedeli, Maxence Thevenet
+ * Revathi Jambunathan
+ *
+ * This file is part of WarpX.
+ *
+ * License: BSD-3-Clause-LBNL
+ */
+
+#include "StringUtils.H"
+
+#include <sstream>
+
+std::vector<std::string>
+ablastr::utils::text::automatic_text_wrap(
+ const std::string& text, const int max_line_length){
+
+ auto ss_text = std::stringstream{text};
+ auto wrapped_text_lines = std::vector<std::string>{};
+
+ std::string line;
+ while(std::getline(ss_text, line,'\n')){
+
+ auto ss_line = std::stringstream{line};
+ int counter = 0;
+ std::stringstream ss_line_out;
+ std::string word;
+
+ while (ss_line >> word){
+ const auto wlen = static_cast<int>(word.length());
+
+ if(counter == 0){
+ ss_line_out << word;
+ counter += wlen;
+ }
+ else{
+ if (counter + wlen < max_line_length){
+ ss_line_out << " " << word;
+ counter += (wlen+1);
+ }
+ else{
+ wrapped_text_lines.push_back(ss_line_out.str());
+ ss_line_out = std::stringstream{word};
+ counter = wlen;
+ }
+ }
+ }
+
+ wrapped_text_lines.push_back(ss_line_out.str());
+ }
+
+ return wrapped_text_lines;
+}