
Michael
04.04.2017
10:10:01
да кстати я и не заметил что у меня указатель баффер не инициализирова
там можно уже и ошибочки обработать, и плохие указатели поймать

Google

Michael
04.04.2017
10:12:50
std::unique_ptr < uint8_t, std::function<void(uint8_t*)>> holder(buffer, [&mbr](uint8_t *buffer) {
mrb_free(mrb, buffer);
});
за это спасибо, научился
вообще не умею еще с++-указатели, не пользовался. знаю о них и не более
это стандарт?

Anatoly
04.04.2017
10:13:47
но defer стандарными средствами :)
но действительно многолословный

Michael
04.04.2017
10:14:32
щас будет реальн тупой вопрос
[&mbr] что значит этот синтаксис
ничего не понял!

Anatoly
04.04.2017
10:15:17
захват контекта лямбдой

Michael
04.04.2017
10:15:24
а, блин, это лямбда
господи!

Anatoly
04.04.2017
10:15:30
и передача туда ссылки на объект mbr

Google

Michael
04.04.2017
10:15:40
да, все очевидно
тупак
окей, юник поинтер с декструкторм нравится
возьму на вооружение

Шаурма
04.04.2017
10:17:38
Да
масштабирования не вижу, но нужно побороть смещение https://gist.github.com/nib952051/df30e6fea374f54d83768d48031e805d

Michael
04.04.2017
10:19:55
еще по чисто красивостям вопрос
если я хочу по-простому распарсить и трансформировать строку, что шустрее всего - просто пройти по символам в строке записывая каждый в стрингстрим?
кстати я сказал слово трансформировать и дошло что можно написать трансформ
это куда проще
спасибо
(на самом деле мне нужны функции котораые заменяет \r?\n на буквальное "\n" и наоборот)
(регекс ооочччень медленный)
не очень по теме чата, понимаю
это совсем осноовы :)
просто был вопрос как оптимально работать с такими сиутациями и не упустил ли я какой-то магии которая лучше чем копирование в стрингстрим посимвольно
ваще стрингстрим медленный, вроде, если память не проблема, можно просто аллоцировать массив 2хдлины оригинала и копировать в него
так и поступлю
что может быть лучше простых алгоритмов
правда лучше не рефренс а значение в ренже

Google

Дед Пегас
04.04.2017
10:54:20
А если заимплементировать в функциональном стиле?

Dumitru
04.04.2017
10:54:24
А еще лучше конст реф)

Michael
04.04.2017
10:54:45
состязание
я предпочитаю декларативный потому что он быстрый
даже в других языках

babysitter
04.04.2017
10:55:29

Дед Пегас
04.04.2017
10:55:32
str_t это элиас на string?

Michael
04.04.2017
10:55:37
а я говорил что надо не char &c а char c
чуток побыстрее будет если компилятор не догадается оптимизировать
(инб4 догадается)

Дед Пегас
04.04.2017
10:56:12
Оки.
А можно текстом кол?
код*
А то с картинки неудобно жуть.

Michael
04.04.2017
10:56:49
да, сейчас
str_t lb_to_lit(const str_t &in)
{
str_t out(2 * in.length(), '\0');
size_t i = 0;
for (char c : in)
{
if (c == '\r') continue;
if (c == '\n')
{
out[i++] = '\\';
out[i++] = 'n';
continue;
}
out[i++] = c;
}
out.resize(i);
return out;
}

Дед Пегас
04.04.2017
10:57:22
Спасибо.

Google

Alex Фэils?︙
04.04.2017
10:57:37
Просьба всем: не пишите кучу сообщений. Пишите в одном. В крайнем случае можно пропатчить свое сообщение

Michael
04.04.2017
10:58:03
меня сильно портит общение со школьниками

Alex Фэils?︙
04.04.2017
10:58:36
Да оно портит весь интернет, он от него тупеет

Artem
04.04.2017
10:58:55
ты же не любишь инкремент. Почему не пишешь out[i] = '\\'; i += 1;?

babysitter
04.04.2017
10:59:15

Michael
04.04.2017
10:59:49
потому что если есть, то почему бы нет :)
а вот наоборот. немного отличается
str_t lit_to_lb(const str_t &in)
{
str_t out(in.length(), '\0');
size_t i = 0;
for (auto it = in.begin(); it != in.end(); ++it)
{
if (*it != '\\' || *(it + 1) != 'n')
{
out[i++] = *it;
continue;
}
out[i++] = '\r';
out[i++] = '\n';
it++;
}
return out;
}
я не проверяю на (it + 1) == in.end(), потому что там нуль-сепаратор, duh
тоже годится
щас еще один алгоритм на замену регекса напишу

Evgeniy
04.04.2017
11:07:51
Почему бы не сделать один switch вместо того чтобы городить ифы?

Michael
04.04.2017
11:08:04
потому что ифов мало и это лаконично и быстро
свитч более громозкий
большую часть проц. времени жрут два регекса
а не мой код и не дисковые операции

Google

Michael
04.04.2017
11:10:17
я заменю это на мэп
вместо статических полей, они мне не всрались

Дед Пегас
04.04.2017
11:11:56
Тупой вариант влоб
str_t lb_to_lit(const str_t& in) {
str_t out;
out.reserve(2 * in.length());
auto func = [&out](const str_t::value_type value) {
switch(value) {
'\n': {
out.push_back('\\');
out.push_back('n');
break;
}
'\r': {
out.push_back('\0');
break;
}
default: {
out.push_back(value);
}
};
};
for_each(begin(in), end(in), func);
out.resize();
return out;
}

Michael
04.04.2017
11:12:44
ужасно
))
мало того что хрен прочьешь
медленно
и out.push_back('\0') не всрался
там просто брейк
и out.reserve(2 * in.length()); не будет работать

Tema
04.04.2017
11:14:10