diff common/common.h @ 0:a4671277546c tip

created the repository for the thymian project
author ferencd
date Tue, 17 Aug 2021 11:19:54 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/common.h	Tue Aug 17 11:19:54 2021 +0200
@@ -0,0 +1,325 @@
+#ifndef COMMON_H
+#define COMMON_H
+
+#include <string>
+#include <vector>
+#include <sstream>
+#include <iomanip>
+#include <functional>
+#include <random>
+#include <iterator>
+#include <algorithm>
+#include <stdlib.h>
+
+namespace
+{
+    static const std::string SLASH = "/";
+    static const std::string HOSTT_WINDOWS          = "WINDOWS";
+    static const std::string HOSTT_LINUX            = "LINUX";
+    static const std::string HOSTT_ANDROID          = "ANDROID";
+    static const std::string HOSTT_AUTHENTICATOR    = "AUTHENTICATOR";
+
+    static const std::string HOSTT_UNKNOWN    = "UNKNOWN";
+}
+/* Functions and their implementation */
+namespace unafrog {
+
+std::string server();
+
+namespace utils {
+
+// trim from start
+static inline std::string &sltrim(std::string &s) {
+        s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun<int, int>(std::isspace))));
+        return s;
+}
+
+// trim from end
+static inline std::string &srtrim(std::string &s) {
+        s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun<int, int>(std::isspace))).base(), s.end());
+        return s;
+}
+
+// trim from both ends
+static inline std::string &trim(std::string &s) {
+        return sltrim(srtrim(s));
+}
+
+/**
+ * Converts the given hex string to a number
+ **/
+template <class T>
+T hex_string_to_nr(const std::string& s)
+{
+    T ret = 0;
+    for (unsigned int i = 0; i < s.length(); i += 2)
+    {
+        ret <<= 8;
+        std::string byteString = s.substr(i, 2);
+        uint8_t byte = static_cast<uint8_t>(strtol(byteString.c_str(), NULL, 16));
+        ret |= byte;
+    }
+    return ret;
+}
+
+/**
+ * Converts the parameter to string. Used since android has no std::to_string
+ **/
+template<class T1>
+std::string to_string(const T1& v)
+{
+    std::stringstream ss;
+    ss << v;
+    return ss.str();
+}
+
+/**
+ * To get a type which can be used in a stringstream to be used as int if type is too small (char)
+ */
+template <class T> struct typefinder { using type = T; };
+template<> struct typefinder<char> { using type = int; };
+template<> struct typefinder<unsigned char> { using type = int; };
+
+/**
+ * Converts the given number to a string. The number must be integral type, floating
+ * point conversion is deleted by default.
+ **/
+template<typename T, class = typename std::enable_if<std::is_integral<T>::value>::type> std::string int_to_hex( T i )
+{
+    std::stringstream stream;
+    stream << std::setfill ('0') << std::setw(sizeof(T)*2)
+           << std::hex << static_cast<typename typefinder<T>::type>(i);
+    return stream.str();
+}
+
+/** Converts the given hex string to the vector of bytes */
+std::vector<uint8_t> hex_string_to_vector(const std::string& s);
+
+/**
+ * Convrets the given input string to a hex string.
+ * Return the hex string, lowercase
+ **/
+std::string hex_to_string(const std::string& input);
+
+/**
+ * Converts the given hext string (as generated by hex_to_string) to the original string
+ */
+std::string string_to_hex(const std::string& input);
+
+/**
+ * Makes a URL with the given arguments
+ **/
+template<class Arg>
+std::string make_url(Arg arg)
+{
+    return to_string(arg);
+}
+
+template<class Arg, class... Args>
+std::string make_url(Arg a, Args... args)
+{
+    std::string res = to_string(a) + SLASH + make_url(args...);
+    return res;
+}
+
+/**
+ * Will remove all HTML tags from the string and transform the HTML special characters into their equivalent
+ **/
+std::string sanitize_user_input(const std::string& s, bool remove_domains = true);
+
+/**
+ * Will sanitize the hostname, ir. remove the - and . characters and replace them with "_"
+ */
+std::string sanitize_hostname_web(std::string hn);
+
+/**
+ * consumes the given number of characters from the strings' beginning, throws if out of range
+ **/
+std::string consume(std::string& s, int c);
+
+/**
+ * Grows the given string to the required length.
+ */
+std::string grow(const std::string& s, std::size_t required_length);
+
+/* The b62 namespace contains functions related to B62 encoding/decoding */
+namespace b62 {
+
+/**
+ * base62 decodes the given string, returns the number
+ */
+uint64_t base62_decode (const std::string &str);
+
+/**
+ * encodes the given number into base62
+ **/
+std::string base62_encode (uint64_t val);
+
+} //b62
+
+/* The random namespace has function for getting random data */
+namespace random {
+
+/* The class for the characters to be used in the string */
+enum class random_string_class
+{
+    RSC_HEX     = 0,
+    RSC_B64     = 1,
+    RSC_FULL    = 2,
+    RSC_ASC_DEC = 3,
+    RSC_DEC     = 4,
+};
+
+
+/**
+ * Will generate a random string with the given charaters from the class
+ **/
+std::string random_string(size_t length , random_string_class cls = unafrog::utils::random::random_string_class::RSC_ASC_DEC);
+
+template<typename Iter, typename RandomGenerator>
+Iter random_element(Iter start, Iter end, RandomGenerator& g)
+{
+    std::uniform_int_distribution<> dis(0, std::distance(start, end) - 1);
+    std::advance(start, dis(g));
+    return start;
+}
+
+template<typename Iter>
+Iter random_element(Iter start, Iter end)
+{
+    static std::random_device rd;
+    static std::mt19937 gen(rd());
+    return random_element(start, end, gen);
+}
+
+template<typename C>
+C random_element(const std::vector<C>& v)
+{
+    return *random_element(v.begin(), v.end());
+}
+
+} // random
+
+
+std::string to_upper(const std::string& s);
+
+template <typename Arg, typename... Args>
+void redirect_stream(std::ostream& out, char sep,
+               Arg&& arg, Args&&... args)
+{
+    out << std::forward<Arg>(arg);
+    ((out << sep << std::forward<Args>(args)), ...);
+}
+
+template <typename... Args>
+std::string join_string(char sep, Args&&... args)
+{
+    std::stringstream ss;
+    redirect_stream(ss, sep, std::forward<Args>(args)...);
+    return ss.str();
+}
+
+}} // unafrog::utils
+
+/**
+ * Will be used to compare string case insensitively
+ **/
+struct case_insensitive_str_eq
+{
+    case_insensitive_str_eq(std::string key);
+    bool operator()(const std::string& item) const;
+    std::string key_;
+};
+
+/**
+ * Converts the given enum class to its base type
+ */
+template <typename E>
+constexpr typename std::underlying_type<E>::type basetype(E e) noexcept
+{
+    return static_cast<typename std::underlying_type<E>::type>(e);
+}
+
+const std::string platform();
+
+/** will join the strings in the vector with the given delimiter */
+std::string join(const std::vector<std::string>& vec, const char* delim);
+
+/** will split the string into substrings, delimited by delim */
+std::vector<std::string> split(const std::string&, const char *delim);
+
+/** will run a piece of code when the scope is left */
+template<class F>
+class scope_exit_runner
+{
+public:
+    scope_exit_runner(F f) : m_f(f) {};
+    scope_exit_runner(F f, bool run) : m_f(f), m_really_run(run) {};
+    virtual ~scope_exit_runner() { if(m_really_run) m_f(); }
+    void invalidate() { m_really_run = false; }
+    void validate() { m_really_run = true; }
+
+    template<typename T>
+    void operator()(T s)
+    {
+        m_f(s);
+    }
+
+private:
+    F m_f;
+    bool m_really_run = true;
+};
+
+template<class F>
+class simple_runner
+{
+public:
+    simple_runner(F f) : m_f(f) {}
+    template<typename T>
+    simple_runner(F f, T t) : m_f(f)
+    {
+        m_f(t);
+    }
+
+    template<typename T>
+    void operator()(T t)
+    {
+        m_f(t);
+    }
+
+private:
+    F m_f;
+
+};
+
+/* just to signal an error */
+unsigned internalServerError();
+
+/* remove the duplicates from a string */
+std::string remove_duplicates(std::string s, char to_remove);
+
+/* removes the quotes from the string */
+void remove_quotes(std::string &s);
+
+
+template<std::size_t I = 0, typename FuncT, typename... Tp>
+inline typename std::enable_if< I == sizeof...(Tp), void>::type
+for_index(std::size_t, std::tuple<Tp...> &, FuncT)
+{}
+
+template<std::size_t I = 0, typename FuncT, typename... Tp>
+inline typename std::enable_if< I < sizeof...(Tp), void>::type
+for_index(int index, std::tuple<Tp...>& t, FuncT f)
+{
+    if (index == 0) f(std::get<I>(t));
+    for_index<I + 1, FuncT, Tp...>(index-1, t, f);
+}
+
+template <class ...Vals>
+std::tuple<Vals...> valset(Vals... v)
+{
+    return std::make_tuple(v...);
+}
+
+#endif
+