#pragma once #include #include #include #include #include #include #include #include #include #include inline std::mutex env_mutex; class Katom; using strings_t = std::vector; using string_pairs = std::vector>; using string_map = std::map; using katom_ptr = std::shared_ptr; using katom_list = std::vector; using katom_lists = std::vector; using katom_list_map = std::map; using katom_iter = katom_list::iterator; using spans_t = std::vector>; using argument_value_map = std::map; std::string trim_left(const std::string& s); std::string trim_right(const std::string& s); std::string trim(std::string s); std::string trim_char_left(std::string s, char remove); std::string trim_char_right(std::string s, char remove); std::string trim_char(std::string s, char remove); std::string string_replace(const std::string& source, const std::string& old_str, const std::string& new_str); std::string regex_escape(const std::string& s); bool contains(const std::string& str, const std::string& substr); bool contains(const std::vector& strings, const std::string& element); std::vector regex_split(std::string s, std::regex re, bool trim_parts=true); std::vector word_split(const std::string& s); bool is_in(std::string s, std::vector v); bool is_not_in(std::string s, std::vector v); std::vector find_all(std::string str, std::regex pattern, int match_group=0); std::vector find_all(std::string str, std::string pattern, int match_group=0); std::string add_margin(std::string s, unsigned int margin_size); std::string justify(const std::string& input_text, unsigned int text_width=80, unsigned int margin_width=0); std::string join(const std::vector& ss, const std::string& separator = " "); std::string join(int argc, char* array[], const std::string& separator = " "); std::string argv_to_string(int argc, char* argv[]); std::string plural(const std::string& word, int count); std::string plural(const std::string& word, const std::vector& things); std::string to_be(int count, bool present = true); int max_length(std::vector ss); std::vector> environment_variables(bool allow_empty_definitions=true); std::string replace_environment_variables(std::string str); std::string abbrev(const std::string& s, unsigned int max_length=65, bool remove_newlines=true); void remove_element(std::vector& ss, std::string removed); void remove_duplicates(std::vector& ss); std::string display_string(const std::string& s, unsigned int width=40, bool replace_newlines=true); std::pair extract_parameter_type(std::string parameter_name); std::tuple regex_split_prefix(const std::regex& pattern, const std::string& text); std::vector dlist_split(const std::string& s); std::string get_env_var(const std::string& var); std::string freplace(const std::string src, std::regex pattern, std::function func); std::string exec(const char* cmd); inline std::string q_(std::string s) { return "\"" + s + "\""; } inline std::string qq_(std::string s) { if (s.find('\n') == std::string::npos) { return "\"" + s + "\""; } else { return "\"\"\"" + s + "\"\"\""; } } template std::vector collect_if(const std::vector& xs, Pred pred) { std::vector out; out.reserve(xs.size()); for (const auto& v : xs) { if (pred(v)) out.push_back(v); } out.shrink_to_fit(); return out; } template bool all_equal(const std::vector& v) { if (v.size() < 2) return true; return std::adjacent_find(v.begin(), v.end(), std::not_equal_to{}) == v.end(); } template int max_key_length(std::map map) { size_t result = 0; for_each(map.begin(), map.end(), [&result](const auto& item) { result = std::max(result, item.first.size()); }); return result; }