2018-11-03 17:12:20 +01:00
|
|
|
#ifndef UTILS_H
|
|
|
|
#define UTILS_H
|
|
|
|
#include <string>
|
|
|
|
#include <string_view>
|
|
|
|
#include <vector>
|
|
|
|
#include <optional>
|
|
|
|
#include <functional>
|
|
|
|
#include <map>
|
|
|
|
#include <regex>
|
|
|
|
#include <ctime>
|
|
|
|
namespace utils
|
|
|
|
{
|
|
|
|
|
2021-10-09 00:24:22 +02:00
|
|
|
std::vector<std::string> split(std::string str, char delim);
|
|
|
|
std::vector<std::string> split(std::string str, const std::string &delim);
|
2021-04-17 12:41:22 +02:00
|
|
|
std::vector<std::string> split(const std::string &str, std::regex ®ex);
|
2018-11-03 17:12:20 +01:00
|
|
|
std::string urldecode(std::string_view str);
|
2021-10-09 00:24:22 +02:00
|
|
|
std::string strreplace(std::string str, const std::string &search, const std::string &replace);
|
2018-11-03 17:12:20 +01:00
|
|
|
|
|
|
|
std::string html_xss(std::string_view str);
|
|
|
|
std::string getenv(const std::string &key);
|
|
|
|
|
2021-10-09 00:10:55 +02:00
|
|
|
template <class T, class U> bool hasKey(const std::map<T, U> &map, const T &key)
|
2018-11-03 17:12:20 +01:00
|
|
|
{
|
|
|
|
auto k = map.find(key);
|
|
|
|
return k != map.end();
|
|
|
|
}
|
|
|
|
|
2021-10-09 00:10:55 +02:00
|
|
|
template <class T, class U> U getKeyOrEmpty(const std::map<T, U> &map, const T &key)
|
2018-11-03 17:12:20 +01:00
|
|
|
{
|
|
|
|
auto k = map.find(key);
|
|
|
|
if(k != map.end())
|
|
|
|
{
|
|
|
|
return k->second;
|
|
|
|
}
|
|
|
|
return U();
|
|
|
|
}
|
|
|
|
|
2021-10-09 00:10:55 +02:00
|
|
|
template <class T, class U> U getKeyOrEmpty(const std::multimap<T, U> &map, const T &key)
|
2018-11-03 17:12:20 +01:00
|
|
|
{
|
|
|
|
auto k = map.find(key);
|
|
|
|
if(k != map.end())
|
|
|
|
{
|
|
|
|
return k->second;
|
|
|
|
}
|
|
|
|
return U();
|
|
|
|
}
|
|
|
|
|
2021-10-09 00:10:55 +02:00
|
|
|
template <class T, class U> std::vector<U> getAll(const std::multimap<T, U> &map, const T &key)
|
2018-11-03 17:12:20 +01:00
|
|
|
{
|
|
|
|
std::vector<U> result;
|
|
|
|
auto range = map.equal_range(key);
|
|
|
|
for(auto it = range.first; it != range.second; it++)
|
|
|
|
{
|
|
|
|
result.push_back(it->second);
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2020-03-18 22:00:15 +01:00
|
|
|
std::string regex_callback_replacer(std::regex regex, const std::string &input,
|
|
|
|
std::function<std::string(std::smatch &)> callback);
|
2018-11-03 17:12:20 +01:00
|
|
|
|
|
|
|
std::string readCompleteFile(std::string_view filepath);
|
|
|
|
|
|
|
|
inline std::string nz(const char *s)
|
|
|
|
{
|
|
|
|
if(s == nullptr)
|
|
|
|
{
|
|
|
|
return std::string{};
|
|
|
|
}
|
|
|
|
return std::string{s};
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: optional
|
|
|
|
inline unsigned int toUInt(const std::string &str)
|
|
|
|
{
|
|
|
|
if(str == "")
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
auto result = std::stoul(str);
|
|
|
|
if(result > std::numeric_limits<unsigned int>::max())
|
|
|
|
{
|
|
|
|
throw std::out_of_range(str + " is too large for unsigned int ");
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string toISODate(time_t t);
|
|
|
|
|
|
|
|
template <class T> inline std::string toString(const T &v)
|
|
|
|
{
|
|
|
|
return std::string(v.begin(), v.end());
|
|
|
|
}
|
|
|
|
|
2021-10-10 12:01:16 +02:00
|
|
|
std::string trim(std::string_view view);
|
2021-10-03 16:47:35 +02:00
|
|
|
|
2018-11-03 17:12:20 +01:00
|
|
|
} // namespace utils
|
|
|
|
#endif
|