40 #include <unordered_map>
41 #include <unordered_set>
63 auto it = std::find(vec.begin(), vec.end(), element);
83 positions[element] =
static_cast<u32>(vec.size());
84 vec.push_back(element);
99 const auto it = positions.find(element);
100 if (it == positions.end())
111 positions[last] =
index;
126 if (vec_1.size() != vec_2.size())
131 std::sort(vec_1.begin(), vec_1.end());
132 std::sort(vec_2.begin(), vec_2.end());
134 return vec_1 == vec_2;
146 return (value >>
index) & 1;
195 if (s.length() >= end.length())
197 return (0 == s.compare(s.length() - end.length(), end.length(), end));
215 if (s.length() >= start.length())
217 return (0 == s.compare(0, start.length(), start));
234 return std::all_of(s.begin(), s.end(), ::isdigit);
246 if (s.empty() || ((!isdigit(s[0])) && (s[0] !=
'-') && (s[0] !=
'+')))
252 strtol(s.c_str(), &p, 10);
266 std::stringstream ss(s.c_str());
269 return (ss.eof() && !ss.fail());
283 CORE_API std::vector<T>
split(
const T& s,
const char delim,
bool obey_brackets =
false)
285 std::vector<T> result;
290 int bracket_level = 0;
292 for (
size_t i = 0; i < s.length(); ++i)
310 if (bracket_level < 0)
317 if (bracket_level == 0)
319 result.push_back(item);
334 result.push_back(item);
339 std::stringstream ss(s);
340 while (std::getline(ss, item, delim))
342 result.push_back(item);
345 if (!s.empty() && s.back() == delim)
347 result.push_back(
"");
362 size_t start = s.find_first_not_of(to_remove);
364 if (start != std::string::npos)
366 return s.substr(start, s.size() - start);
384 size_t end = s.find_last_not_of(to_remove);
386 if (end != std::string::npos)
388 return s.substr(0, end + 1);
406 size_t start = s.find_first_not_of(to_remove);
407 size_t end = s.find_last_not_of(to_remove);
409 if (start != T::npos)
411 return s.substr(start, end - start + 1);
438 while ((pos = s.find(search, pos)) != T::npos)
440 s.replace(pos, search.length(),
replace);
457 template<
typename Iterator,
class Transform>
458 CORE_API std::string
join(
const std::string& joiner,
const Iterator& begin,
const Iterator& end,
const Transform& transform)
460 std::stringstream ss;
462 for (
auto it = begin; it != end; ++it)
469 ss << transform(*it);
483 template<
typename T,
class Transform>
484 CORE_API std::string
join(
const std::string& joiner,
const T& items,
const Transform& transform)
486 return join(joiner, items.begin(), items.end(), transform);
499 return join(joiner, items.begin(), items.end(), [](
const auto& v) { return v; });
512 std::transform(result.begin(), result.end(), result.begin(), [](
char c) { return std::toupper(c); });
526 std::transform(result.begin(), result.end(), result.begin(), [](
char c) { return std::tolower(c); });
541 auto position = s.find(substr, 0);
543 while (position != std::string::npos)
546 position = s.find(substr, position + 1);
558 template<
typename T,
template<
typename,
typename...>
class Container,
typename... Args>
561 return std::vector<T>(container.begin(), container.end());
570 template<
typename T,
template<
typename,
typename...>
class Container,
typename... Args>
573 return std::set<T>(container.begin(), container.end());
584 template<
typename T1,
typename T2>
587 for (
const auto& element : subset)
589 if (std::find(std::begin(superset), std::end(superset), element) == std::end(superset))
620 CORE_API std::filesystem::path
which(
const std::string&
name,
const std::string& path =
"");
719 CORE_API std::filesystem::path
get_file(std::string file_name, std::vector<std::filesystem::path> path_hints);
743 using iterator = std::filesystem::recursive_directory_iterator;
762 return std::filesystem::recursive_directory_iterator(p_);
772 return std::filesystem::recursive_directory_iterator();
776 std::filesystem::path p_;
785 using iterator = std::filesystem::directory_iterator;
805 return std::filesystem::directory_iterator(p_);
815 return std::filesystem::directory_iterator();
819 std::filesystem::path p_;
832 Color(
int _h = 0,
int _s = 0,
int _v = 0) : h(_h), s(_s), v(_v)
838 return "h=" + std::to_string(h) +
" s=" + std::to_string(s) +
" v=" + std::to_string(v);
DirectoryRange(std::filesystem::path path)
std::filesystem::directory_iterator iterator
std::filesystem::recursive_directory_iterator iterator
RecursiveDirectoryRange(std::filesystem::path path)
std::filesystem::path get_config_directory()
bool folder_exists_and_is_accessible(const std::filesystem::path &path)
u64 get_bit(const u64 value, const u64 index)
std::filesystem::path get_share_directory()
T replace(const T &str, const T &search, const T &replace)
T rtrim(const T &s, const char *to_remove=" \t\r\n")
u64 clear_bit(const u64 value, const u64 index)
bool is_digits(const T &s)
std::filesystem::path get_library_directory()
void indexed_vector_push_back(std::vector< T > &vec, std::unordered_map< T, u32 > &positions, T element)
Result< u64 > wrapped_stoull(const std::string &s, const u32 base=10)
Result< u32 > wrapped_stoul(const std::string &s, const u32 base=10)
u32 num_of_occurrences(const T &s, const T &substr)
std::filesystem::path which(const std::string &name, const std::string &path="")
std::set< T > to_set(const Container< T, Args... > &container)
std::filesystem::path get_default_log_directory(std::filesystem::path source_file="")
bool vectors_have_same_content(std::vector< T > vec_1, std::vector< T > vec_2)
std::filesystem::path get_first_directory_exists(std::vector< std::filesystem::path > path_hints)
std::filesystem::path get_file(std::string file_name, std::vector< std::filesystem::path > path_hints)
bool is_subset(const T1 &subset, const T2 &superset)
std::string join(const std::string &joiner, const Iterator &begin, const Iterator &end, const Transform &transform)
Result< std::filesystem::path > get_unique_temp_directory(const std::string &prefix="", const u32 max_attempts=5)
std::filesystem::path get_base_directory()
bool starts_with(const T &s, const T &start)
std::string get_open_source_licenses()
u64 set_bit(const u64 value, const u64 index)
bool is_floating_point(const T &s)
T ltrim(const T &s, const char *to_remove=" \t\r\n")
bool indexed_vector_erase(std::vector< T > &vec, std::unordered_map< T, u32 > &positions, T element)
bool ends_with(const T &s, const T &end)
std::filesystem::path get_binary_directory()
std::vector< std::filesystem::path > get_plugin_directories()
std::vector< std::filesystem::path > get_gate_library_directories()
std::vector< T > to_vector(const Container< T, Args... > &container)
bool file_exists(const std::string &filename)
bool unordered_vector_erase(std::vector< T > &vec, T element)
std::filesystem::path get_user_share_directory()
bool is_integer(const T &s)
std::filesystem::path get_user_config_directory()
std::vector< T > split(const T &s, const char delim, bool obey_brackets=false)
u64 toggle_bit(const u64 value, const u64 index)
T trim(const T &s, const char *to_remove=" \t\r\n")
Color(int _h=0, int _s=0, int _v=0)