#include "utils.hpp"
#include <string>
#include <vector>

/** \cond NOT_REMOVE_FROM_DOC
*/
namespace utils
{
typedef std::string             string;
typedef std::basic_string<uint> ustring;

ustring UTF8_to_unicode(const string& s);
uint    UTF8_to_unicode(char c);

string  unicode_to_UTF8(const ustring& s);
char    unicode_to_UTF8(const uint& c);

uint    hex_to_uint(const string& s);

long string_to_int(const string& s);
long string_to_int(const ustring& s);

unsigned long string_to_uint(const string& s);
unsigned long  string_to_uint(const ustring& s);

double string_to_float(const string& s);
double string_to_float(const ustring& s);

string int_to_string(const long& i);
string uint_to_string(const unsigned long& ui);

string float_to_string(float f);
string double_to_string(double d);

string to_string(const string& s, uint uiNbr);

string to_string(const char* s);
string to_string(const char* s, uint uiNbr);

string to_string(char* s);
string to_string(char* s, uint uiNbr);

template<uint N>
string to_string(const char s[N])
{
    return s;
}

template<uint N>
string to_string(const char s[N], uint uiNbr)
{
    string sReturn;

    for (uint uiCounter = 0; uiCounter < uiNbr; ++uiCounter)
        sReturn += s;

    return sReturn;
}

template<uint N>
string to_string(char s[N])
{
    return s;
}

template<uint N>
string to_string(char s[N], uint uiNbr)
{
    string sReturn;

    for (uint uiCounter = 0; uiCounter < uiNbr; ++uiCounter)
        sReturn += s;

    return sReturn;
}

string to_string(char c);
string to_string(char c, uint uiNbr);

string to_string(int i);
string to_string(int i, uint uiCharNbr);

string to_string(uint ui);
string to_string(uint ui, uint uiCharNbr);

string to_string(float f);
string to_string(float f, uint uiDigitNbr);
string to_string(float f, uint uiIntCharNbr, uint uiFraCharNbr);

string to_string(double f);
string to_string(double f, uint uiDigitNbr);
string to_string(double f, uint uiIntCharNbr, uint uiFraCharNbr);

string to_string(bool b);

template<class T>
string to_string(T* p)
{
    if (p != nullptr)
        return to_string((uint)p);
    else
        return "NULL";
}

void trim(string& s, char cPattern);

typedef std::vector<string> string_vector;
std::vector<string> cut(const string& s, const std::string& sDelim);
std::vector<string> cut(const string& s, const string& sDelim, uint uiMaxCut);

std::vector<string> cut_each(const string& s, const string& sDelim);
std::vector<string> cut_each(const string& s, const string& sDelim, uint uiMaxCut);

std::vector<string> cut(const string& s, const std::vector<char>& lDelims);

/** \endcond
*/
}
