33template <typename T, typename = typename std::enable_if<std::is_enum<T>::value>::type>
34std::ostream &
operator<<(std::ostream &in,
const T &item) {
37 return in << +static_cast<typename std::underlying_type<T>::type>(item);
43using enums::operator<<;
48CLI11_MODULE_INLINE
constexpr int expected_max_vector_size{1 << 29};
51CLI11_INLINE std::vector<std::string> split(
const std::string &s,
char delim);
54template <
typename T> std::string join(
const T &v, std::string delim =
",") {
56 auto beg = std::begin(v);
57 auto end = std::end(v);
64 if(!rval.empty() && delim.size() == 1 && rval.back() == delim[0]) {
74 typename =
typename std::enable_if<!std::is_constructible<std::string, Callable>::value>::type>
75std::string join(
const T &v, Callable func, std::string delim =
",") {
77 auto beg = std::begin(v);
78 auto end = std::end(v);
81 auto nloc = s.tellp();
92template <
typename T> std::string rjoin(
const T &v, std::string delim =
",") {
94 for(std::size_t start = 0; start < v.size(); start++) {
97 s << v[v.size() - start - 1];
105CLI11_INLINE std::string <rim(std::string &str);
108CLI11_INLINE std::string <rim(std::string &str,
const std::string &filter);
111CLI11_INLINE std::string &rtrim(std::string &str);
114CLI11_INLINE std::string &rtrim(std::string &str,
const std::string &filter);
117inline std::string &trim(std::string &str) {
return ltrim(rtrim(str)); }
120inline std::string &trim(std::string &str,
const std::string &filter) {
return ltrim(rtrim(str, filter), filter); }
123inline std::string trim_copy(
const std::string &str) {
129CLI11_INLINE std::string &remove_outer(std::string &str,
char key);
132CLI11_INLINE std::string &remove_quotes(std::string &str);
135CLI11_INLINE
void remove_quotes(std::vector<std::string> &args);
141CLI11_INLINE std::string fix_newlines(
const std::string &leader, std::string input);
144inline std::string trim_copy(
const std::string &str,
const std::string &filter) {
146 return trim(s, filter);
150CLI11_INLINE std::ostream &format_aliases(std::ostream &out,
const std::vector<std::string> &aliases, std::size_t wid);
154template <
typename T>
bool valid_first_char(T c) {
155 return ((c !=
'-') && (
static_cast<unsigned char>(c) > 33));
159template <
typename T>
bool valid_later_char(T c) {
163 return ((c !=
'=') && (c !=
':') && (c !=
'{') && ((
static_cast<unsigned char>(c) > 32) || c ==
'\t'));
167CLI11_INLINE
bool valid_name_string(
const std::string &str);
170inline bool valid_alias_name_string(
const std::string &str) {
171 return ((str.find_first_of(
'\n') == std::string::npos) && (str.find_first_of(
'\0') == std::string::npos));
175inline bool is_separator(
const std::string &str) {
176 return (str.empty() || (str.size() == 2 && str[0] ==
'%' && str[1] ==
'%'));
180inline bool isalpha(
const std::string &str) {
181 return std::all_of(str.begin(), str.end(), [](
char c) { return std::isalpha(c, std::locale()); });
185inline std::string to_lower(std::string str) {
186 std::transform(std::begin(str), std::end(str), std::begin(str), [](
const std::string::value_type &x) {
187 return std::tolower(x, std::locale());
193inline std::string remove_underscore(std::string str) {
194 str.erase(std::remove(std::begin(str), std::end(str),
'_'), std::end(str));
200CLI11_INLINE std::string get_group_separators();
203CLI11_INLINE std::string find_and_replace(std::string str, std::string from, std::string to);
206inline bool has_default_flag_values(
const std::string &flags) {
207 return (flags.find_first_of(
"{!") != std::string::npos);
210CLI11_INLINE
void remove_default_flag_values(std::string &flags);
213CLI11_INLINE std::ptrdiff_t find_member(std::string name,
214 const std::vector<std::string> &names,
215 bool ignore_case =
false,
216 bool ignore_underscore =
false);
220template <
typename Callable>
inline std::string find_and_modify(std::string str, std::string trigger, Callable modify) {
221 std::size_t start_pos = 0;
222 while((start_pos = str.find(trigger, start_pos)) != std::string::npos) {
223 start_pos = modify(str, start_pos);
230CLI11_INLINE std::size_t close_sequence(
const std::string &str, std::size_t start,
char closure_char);
234CLI11_INLINE std::vector<std::string> split_up(std::string str,
char delimiter =
'\0');
237CLI11_INLINE std::string get_environment_value(
const std::string &env_name);
243CLI11_INLINE std::size_t escape_detect(std::string &str, std::size_t offset);
248CLI11_INLINE
bool has_escapable_character(
const std::string &str);
253CLI11_INLINE std::string add_escaped_characters(
const std::string &str);
256CLI11_INLINE std::string remove_escaped_characters(
const std::string &str);
259CLI11_INLINE std::string binary_escape_string(
const std::string &string_to_escape,
bool force =
false);
261CLI11_INLINE
bool is_binary_escaped_string(
const std::string &escaped_string);
264CLI11_INLINE std::string extract_binary_string(
const std::string &escaped_string);
267CLI11_INLINE
bool process_quoted_string(std::string &str,
268 char string_char =
'\"',
269 char literal_char =
'\'',
270 bool disable_secondary_array_processing =
false);
274CLI11_INLINE std::ostream &streamOutAsParagraph(std::ostream &out,
275 const std::string &text,
276 std::size_t paragraphWidth,
277 const std::string &linePrefix =
"",
278 bool skipPrefixOnFirstLine =
false);
287#include "impl/StringTools_inl.hpp"
std::ostream & operator<<(std::ostream &in, const T &item)
output streaming for enumerations
Definition StringTools.hpp:34