HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 06.10.2017, 23:32
SR_team
Флудер
Регистрация: 26.10.2013
Сообщений: 4,924
С нами: 6603505

Репутация: 183


По умолчанию

Пиздатый апгрейд std::string. Теперь строки юзабельны и const char* не нужен!

Цитата:
Сообщение от Спойлер  


Код:





Код:
#ifndef SRSTRING_H
#define SRSTRING_H

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

enum eRegExp{
    eRe_notMatched,
    eRe_matched,
    eRe_searched
};

template
class SRStringBase : public std::basic_string
{
public:
    SRStringBase() : std::basic_string() {}
    SRStringBase(TChar c) { this->push_back(c); }
    SRStringBase(const TChar * str) : std::basic_string(str) {}
    SRStringBase(TChar * str)  : std::basic_string(str) {}
    SRStringBase(std::basic_string str) : std::basic_string(str) {}
    SRStringBase(const SRStringBase &str) : std::basic_string(str.c_str()) {}

    template
    static SRStringBase sprintf(const SRStringBase &format, Args ... args)
    {
        size_t size = snprintf( nullptr, 0, format.c_str(), args ... ) + 1;
        std::unique_ptr buf( new char[ size ] );
        snprintf( buf.get(), size, format.c_str(), args ... );
        return SRStringBase( buf.get() );
    }

    template
    void format(const SRStringBase &format, Args ... args)
    {
        this->clear();
        size_t size = snprintf( nullptr, 0, format.c_str(), args ... ) + 1;
        std::unique_ptr buf( new char[ size ] );
        snprintf( buf.get(), size, format.c_str(), args ... );
        this->append(SRStringBase( buf.get() ));
    }
    template
    void args(Args ... args)
    {
        size_t size = snprintf( nullptr, 0, this->c_str(), args ... ) + 1;
        std::unique_ptr buf( new char[ size ] );
        snprintf( buf.get(), size, this->c_str(), args ... );
        this->clear();
        this->append(SRStringBase( buf.get() ));
    }

    const SRStringBase toUpper()
    {
        std::transform(this->begin(), this->end(), this->begin(), ::toupper);
        return SRStringBase(*this);
    }
    const SRStringBase toLower()
    {
        std::transform(this->begin(), this->end(), this->begin(), ::tolower);
        return SRStringBase(*this);
    }

    int toInt(int base = 10)
    {
        int ret;
        try {
            ret = std::stoi(std::basic_string(*this), 0, base);
        } catch (std::exception &) {
            ret = std::stoll(std::basic_string(*this), 0, base);
        }
        return ret;
    }
    unsigned int toUInt(int base = 10)
    {
        unsigned int ret;
        try {
            ret = std::stoi(std::basic_string(*this), 0, base);
        } catch (std::exception &) {
            ret = std::stoull(std::basic_string(*this), 0, base);
        }
        return ret;
    }
    long toLong(int base = 10)
    {
        long ret;
        try {
            ret = std::stol(std::basic_string(*this), 0, base);
        } catch (std::exception &) {
            ret = std::stoll(std::basic_string(*this), 0, base);
        }
        return ret;
    }
    long long toLongLong(int base = 10)
    {
        return std::stoll(std::basic_string(*this), 0, base);
    }
    unsigned long toULong(int base = 10)
    {
        unsigned long ret;
        try {
            ret = std::stoul(std::basic_string(*this), 0, base);
        } catch (std::exception &) {
            ret = std::stoull(std::basic_string(*this), 0, base);
        }
        return ret;
    }
    unsigned long long toULongLong(int base = 10)
    {
        return std::stoull(std::basic_string(*this), 0, base);
    }
    float toFloat()
    {
        float ret;
        try {
            ret = std::stof(std::basic_string(*this));
        } catch (std::exception &) {
            ret = std::stod(std::basic_string(*this));
        }
        return ret;
    }
    double toDouble()
    {
        double ret;
        try {
            ret = std::stod(std::basic_string(*this));
        } catch (std::exception &) {
            ret = std::stold(std::basic_string(*this));
        }
        return ret;
    }
    long double toLongDouble()
    {
        return std::stold(std::basic_string(*this));
    }

    const std::deque> split(TChar delimeter)
    {
        std::basic_stringstream ss(*this);
        std::basic_string item;
        std::deque> splittedStrings;
        while (std::getline(ss, item, delimeter))
        {
            splittedStrings.push_back(item);
        }
        return splittedStrings;
    }

    void push_front(TChar __c)
    {
        this->insert(0, std::basic_string(SRStringBase(__c)));
    }
    void pop_front() noexcept
    {
        this->erase(0, 1);
    }

    const SRStringBase replace(size_t start, size_t len, SRStringBase new_str)
    {
        this->std::basic_string::replace(start, len, std::basic_string(new_str));
        return SRStringBase(*this);
    }
    const SRStringBase replace(SRStringBase old_str, SRStringBase new_str)
    {
        size_t find_pos = 0;
        while (true){
            size_t pos = this->find(std::basic_string(old_str), find_pos);
            if (pos == this->npos)
                break;
            replace(pos, old_str.length(), new_str);
            find_pos = pos + new_str.length();
        }
        return SRStringBase(*this);
    }
    const SRStringBase replace(TChar old_str, SRStringBase new_str)
    {
        size_t find_pos = 0;
        while (true){
            size_t pos = this->find(std::basic_string(SRStringBase(old_str)), find_pos);
            if (pos == this->npos)
                break;
            replace(pos, 1, new_str);
            find_pos = pos + 1;
        }
        return SRStringBase(*this);
    }
    const SRStringBase replace(SRStringBase old_str, TChar new_str)
    {
        size_t find_pos = 0;
        while (true){
            size_t pos = this->find(std::basic_string(old_str), find_pos);
            if (pos == this->npos)
                break;
            replace(pos, old_str.length(), new_str);
            find_pos = pos + new_str.length();
        }
        return SRStringBase(*this);
    }
    const SRStringBase replace(TChar old_str, TChar new_str)
    {
        size_t find_pos = 0;
        while (true){
            size_t pos = this->find(std::basic_string(SRStringBase(old_str)), find_pos);
            if (pos == this->npos)
                break;
            replace(pos, 1, new_str);
            find_pos = pos + 1;
        }
        return SRStringBase(*this);
    }

    const SRStringBase removeFirst(size_t len = 1)
    {
        std::basic_string::erase(0, len);
        return SRStringBase(*this);
    }
    const SRStringBase removeLast(size_t len = 1)
    {
        std::basic_string::erase(this->length() - len, len);
        return SRStringBase(*this);
    }

    const SRStringBase remove(size_t start, size_t len)
    {
        std::basic_string::erase(start, len);
        return SRStringBase(*this);
    }
    const SRStringBase remove(TChar chr)
    {
        replace(chr, "");
        return SRStringBase(*this);
    }
    const SRStringBase remove(SRStringBase str)
    {
        replace(str, "");
        return SRStringBase(*this);
    }

    const SRStringBase removeOne(TChar chr)
    {
        size_t pos = this->find(std::basic_string(SRStringBase(chr)));
        if (pos != this->npos){
            this->std::basic_string::replace(pos, 1, std::basic_string(""));
        }
        return SRStringBase(*this);
    }
    const SRStringBase removeOne(SRStringBase str)
    {
        size_t pos = this->find(std::basic_string(str));
        if (pos != this->npos){
            this->std::basic_string::replace(pos, str.length(), std::basic_string(""));
        }
        return SRStringBase(*this);
    }

    bool isEmpty()
    {
        return (this->length() == 0);
    }

    bool indexOf(const SRStringBase &str)
    {
        return (this->find(std::basic_string(str)) != this->npos);
    }

    eRegExp indexIn(const std::regex &re)
    {
        if (std::regex_match(this->c_str(), cmatch, re))
            return eRegExp::eRe_matched;
        else if (std::regex_search(this->c_str(), cmatch, re))
            return eRegExp::eRe_searched;
        return eRegExp::eRe_notMatched;
    }
    eRegExp indexIn(const SRStringBase &re, std::regex::flag_type flag = std::regex::ECMAScript)
    {
        std::regex _re(re, flag);
        return indexIn(_re);
    }
    const SRStringBase cap(int id)
    {
        if (id >= cmatch.size())
            return "";
        return cmatch[id].str();
    }
    size_t sizeCap()
    {
        return cmatch.size();
    }
    const std::cmatch lastCmatch()
    {
        return cmatch;
    }

    const SRStringBase toUnicode()
    {
        std::wstring_convert> converter;
        if (typeid (TChar) == typeid (wchar_t))
            return SRStringBase(*this);
        return converter.from_bytes(*this);
    }
    const SRStringBase toAnsi()
    {
        std::wstring_convert> converter;
        if (typeid (TChar) == typeid (char))
            return SRStringBase(*this);
        return converter.to_bytes(*this);
    }

    void fromUnicode(const SRStringBase &str)
    {
        std::wstring_convert> converter;
        this->clear();
        if (typeid (TChar) == typeid (wchar_t))
            this->append((TChar*)str.c_str());
        else this->append((TChar*)converter.to_bytes(str).c_str());
    }
    void fromAnsi(const SRStringBase &str)
    {
        std::wstring_convert> converter;
        this->clear();
        if (typeid (TChar) == typeid (char))
            this->append((TChar*)str.c_str());
        else this->append((TChar*)converter.from_bytes(str).c_str());
    }

    static SRStringBase Ansi2Unicode(const char* str)
    {
        std::wstring_convert> converter;
        return converter.from_bytes(str);
    }
    static SRStringBase Unicode2Ansi(const wchar_t* str)
    {
        std::wstring_convert> converter;
        return converter.to_bytes(str);
    }

private:
    std::cmatch cmatch;
};

typedef SRStringBase SRString;
typedef std::deque SRStringList;
typedef SRStringBase SRWstring;
typedef std::deque SRWstringList;

#endif // SRSTRING_H


Класс имеет кучу *****тых методов, которых крайне не хватает в чистом std::string, начнем со статичных методов:
  • sprintf(format, args) - аналог C'шной функции, но глотает строку и сплевывает тоже строку, при этом не требует предварительного создания буффера.
  • Ansi2Unicode(string) - создание UNICODE строки из ANSI строки.
  • Unicode2Ansi(string) - создание ANSI строки из UNICODE строки.
Обычные методы класса:
  • format(format, args) - форматирование строки.
  • args(args) - вставка аргументов в строку.
  • toUpper() - перевести всю строку в верхний регистр.
  • toLower() - перевести всю строку в нижний регистр.
  • toInt(base) - перевести строку в число, base - система счисления.
  • toUInt(base) - перевести строку в без-знаковое число, base - система счисления.
  • toLong(base) - аналог toInt().
  • toULong(base) - аналог toUInt().
  • toLongLong(base) - перевести строку в длинное число, base - система счисления.
  • toULongLong(base) - перевести строку в длинное без-знаковое число, base - система счисления.
  • toFloat() - перевести строку в число с плавающей запятой.
  • toDouble() - перевести строку в число с плавающей запятой двойной точности.
  • toLongDouble() - перевести строку в длинное число с плавающей запятой двойной точности.
  • split(delimeter) - разбить строку на несколько строк, delimeter - символ разделения.
  • push_front(char) - добавить символ в начало строки.
  • pop_front() - удалить первый символ строки.
  • replace(old, new) - заменить подстроки old на подстроки new.
  • removeFirst( n ) - удалить первые n символов.
  • removeLast( n ) - удалить последние n символов.
  • remove(pos, n) - удалить n символов после позиции pos.
  • remove(string) - удалить из строки каждое вхождение подстроки string.
  • removeOne(string) - удалить первое вхождение подстроки string.
  • isEmpty() - проверка пустая ли строка.
  • indexOf(string) - проверка есть ли подстрока string в строке.
  • indexIn(re) - проверка матчится ли строка регуляркой.
  • cap(id) - получить подстроку под номером id из ранее заюзаной регулярки.
  • sizeCap() - получить число подстрок из ранее заюзаной регулярки.
  • lastCmatch() - получить std::cmatch из ранее заюзаной регулярки.
  • toUnicode() - создать UNICODE строку из текущей строки.
  • toAnsi() - создать ANSI строку из текущей строки.
  • fromUnicode(string) - создать текущую строку из UNICODE строки.
  • fromAnsi(string) - создать текущую строку из ANSI строки.
Остальные методы наследуются от std::string.
 
Ответить с цитированием
 





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.

×

Создать сделку

Продавец: ник или ID

Название сделки:

Сумма USDT:

Срок сделки, дней:

Кто платит комиссию:

Условия сделки:

После создания сделки средства будут зарезервированы в холде до завершения сделки.

×

Мои сделки

Загрузка...
×

Сделка


Загрузка чата...