17 #include "libmesh/int_range.h" 18 #include "libmesh/libmesh_common.h" 30 trim(
const std::string & str,
const std::string & white_space =
" \t\n\v\f\r")
32 const auto begin = str.find_first_not_of(white_space);
33 if (begin == std::string::npos)
35 const auto end = str.find_last_not_of(white_space);
36 return str.substr(begin, end - begin + 1);
48 std::vector<T> & elements,
49 unsigned int min_len = 1,
50 const std::string & delims =
"/")
54 std::string::size_type last_pos = str.find_first_not_of(delims, 0);
55 std::string::size_type pos = str.find_first_of(delims,
std::min(last_pos + min_len, str.size()));
57 while (last_pos != std::string::npos)
59 elements.push_back(str.substr(last_pos, pos - last_pos));
61 last_pos = str.find_first_not_of(delims, pos);
62 if (last_pos == std::string::npos)
64 pos = str.find_first_of(delims,
std::min(last_pos + min_len, str.size()));
88 convert(
const std::string & str, T & value,
const bool throw_on_failure)
91 if constexpr (std::is_same_v<short int, T> || std::is_same_v<unsigned short int, T> ||
92 std::is_same_v<int, T> || std::is_same_v<unsigned int, T> ||
93 std::is_same_v<long int, T> || std::is_same_v<unsigned long int, T> ||
94 std::is_same_v<long long int, T> || std::is_same_v<unsigned long long int, T>)
97 long double double_val;
98 std::stringstream double_ss(str);
99 double_ss >> double_val;
101 if (!double_ss.fail() && double_ss.eof())
104 std::stringstream int_ss(str);
105 const bool use_int = !(int_ss >>
value).fail() && int_ss.eof();
108 if (double_val == static_cast<long double>(static_cast<T>(double_val)))
111 value =
static_cast<T
>(double_val);
120 if constexpr (std::is_base_of_v<std::string, T>)
128 std::stringstream ss(
trim(str));
129 if (!(ss >>
value).fail() && ss.eof())
134 if (throw_on_failure)
135 throw std::invalid_argument(
"Unable to convert '" + str +
"' to type " +
143 template <
typename T>
146 std::vector<T> & tokenized_vector,
147 const std::string &
delimiter =
" \t\n\v\f\r")
149 std::vector<std::string> tokens;
151 tokenized_vector.resize(tokens.size());
153 if (!convert<T>(tokens[i], tokenized_vector[i],
false))
165 std::transform(
name.begin(),
name.end(),
name.begin(), ::toupper);
176 std::transform(
name.begin(),
name.end(),
name.begin(), ::tolower);
std::string name(const ElemQuality q)
void tokenize(const std::string &str, std::vector< T > &elements, unsigned int min_len=1, const std::string &delims="/")
This function will split the passed in string on a set of delimiters appending the substrings to the ...
bool tokenizeAndConvert(const std::string &str, std::vector< T > &tokenized_vector, const std::string &delimiter=" \\\)
tokenizeAndConvert splits a string using delimiter and then converts to type T.
bool convert(const std::string &str, T &value, const bool throw_on_failure)
Takes the string representation of a value and converts it to the value.
std::string toUpper(std::string name)
Convert supplied string to upper case.
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
std::string trim(const std::string &str, const std::string &white_space=" \\\)
Standard scripting language trim function.
std::string toLower(std::string name)
Convert supplied string to lower case.
std::string demangle(const char *name)
auto min(const L &left, const R &right)
auto index_range(const T &sizable)