40 #include <unordered_set>
62 auto it = std::find(vec.begin(), vec.end(), element);
82 if (vec_1.size() != vec_2.size())
87 std::sort(vec_1.begin(), vec_1.end());
88 std::sort(vec_2.begin(), vec_2.end());
90 return vec_1 == vec_2;
102 return (value >>
index) & 1;
151 if (s.length() >= end.length())
153 return (0 == s.compare(s.length() - end.length(), end.length(), end));
171 if (s.length() >= start.length())
173 return (0 == s.compare(0, start.length(), start));
190 return std::all_of(s.begin(), s.end(), ::isdigit);
202 if (s.empty() || ((!isdigit(s[0])) && (s[0] !=
'-') && (s[0] !=
'+')))
208 strtol(s.c_str(), &p, 10);
222 std::stringstream ss(s.c_str());
225 return (ss.eof() && !ss.fail());
239 CORE_API std::vector<T>
split(
const T& s,
const char delim,
bool obey_brackets =
false)
241 std::vector<T> result;
246 int bracket_level = 0;
248 for (
size_t i = 0; i < s.length(); ++i)
266 if (bracket_level < 0)
273 if (bracket_level == 0)
275 result.push_back(item);
290 result.push_back(item);
295 std::stringstream ss(s);
296 while (std::getline(ss, item, delim))
298 result.push_back(item);
301 if (s.back() == delim)
303 result.push_back(
"");
318 size_t start = s.find_first_not_of(to_remove);
320 if (start != std::string::npos)
322 return s.substr(start, s.size() - start);
340 size_t end = s.find_last_not_of(to_remove);
342 if (end != std::string::npos)
344 return s.substr(0, end + 1);
362 size_t start = s.find_first_not_of(to_remove);
363 size_t end = s.find_last_not_of(to_remove);
365 if (start != T::npos)
367 return s.substr(start, end - start + 1);
394 while ((pos = s.find(search, pos)) != T::npos)
396 s.replace(pos, search.length(),
replace);
413 template<
typename Iterator,
class Transform>
414 CORE_API std::string
join(
const std::string& joiner,
const Iterator& begin,
const Iterator& end,
const Transform& transform)
416 std::stringstream ss;
418 for (
auto it = begin; it != end; ++it)
425 ss << transform(*it);
439 template<
typename T,
class Transform>
440 CORE_API std::string
join(
const std::string& joiner,
const T& items,
const Transform& transform)
442 return join(joiner, items.begin(), items.end(), transform);
455 return join(joiner, items.begin(), items.end(), [](
const auto& v) { return v; });
468 std::transform(result.begin(), result.end(), result.begin(), [](
char c) { return std::toupper(c); });
482 std::transform(result.begin(), result.end(), result.begin(), [](
char c) { return std::tolower(c); });
497 auto position = s.find(substr, 0);
499 while (position != std::string::npos)
502 position = s.find(substr, position + 1);
514 template<
typename T,
template<
typename,
typename...>
class Container,
typename... Args>
517 return std::vector<T>(container.begin(), container.end());
526 template<
typename T,
template<
typename,
typename...>
class Container,
typename... Args>
529 return std::set<T>(container.begin(), container.end());
540 template<
typename T1,
typename T2>
543 for (
const auto& element : subset)
545 if (std::find(std::begin(superset), std::end(superset), element) == std::end(superset))
576 CORE_API std::filesystem::path
which(
const std::string&
name,
const std::string& path =
"");
675 CORE_API std::filesystem::path
get_file(std::string file_name, std::vector<std::filesystem::path> path_hints);
699 using iterator = std::filesystem::recursive_directory_iterator;
718 return std::filesystem::recursive_directory_iterator(p_);
728 return std::filesystem::recursive_directory_iterator();
732 std::filesystem::path p_;
741 using iterator = std::filesystem::directory_iterator;
761 return std::filesystem::directory_iterator(p_);
771 return std::filesystem::directory_iterator();
775 std::filesystem::path p_;
788 Color(
int _h = 0,
int _s = 0,
int _v = 0) : h(_h), s(_s), v(_v)
794 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()
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 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)