Skip to content

Latest commit

 

History

History
73 lines (64 loc) · 8.9 KB

File metadata and controls

73 lines (64 loc) · 8.9 KB


Ranges

std::transform
std::copy_if

Вместо того чтобы делать цикл который делай не пойми что можно запилить набор функциональных штук выше, которые выполнят нашу задачу

Удобно их собирать в некоторые “контейнеры” — view. Самый внешний такой вью называется Ranges v3 (оно же библиотека)

Насколько понял, оно считает это все постепенно, а не все сразу (намек на корутины?), но можно сказать посчитай все сразу.

Push and pull strategies

Пусть у нас есть такая последовательность вызовов h(g(f(...)))

Pull model (это вьюхи)
Стратегия следующая: внешний цикл хочет прочитать данные у h, h в свою очередь спрашивает их у g, а потом с этими данными что-то делает. g же спрашивает их у f и т. д.

Push model (а это уже не вьюха, это что-то другое)
Другая стратегия: Мы говорим f “запиши нам данные”, но f ничего не хранит и предает их в g, g что-то тоже ничего не хранит и передает их в h и т. д.

Если мы хотим дерево, то если g зависит от двух f, то push нереализуема, а если g разбивается на две h, то неосуществима pull.

Например:
cin работает по pull модели
cout работает по push модели

Stackless coroutines

Основаны на том, что компилятор за нас будет переписывать код

generator<int> tenInts() {
	for (int i = 0; i < 10; ++i) {
		cout << "Next: " << i;
		co_yield i; // Точка паузы + return
	}
}

int main() { genetaror<int> g = tenInts(); for (int v : g) { // Do something } }

Позволяет упростить асинхронные операции

future<path> cacheUrl(string url) {
	cout << "Downloading url";
	string text = co_await downloadingAsync(url);
cout <span class="token operator">&lt;&lt;</span> <span class="token string">"Saving in cache"</span><span class="token punctuation">;</span>
path p <span class="token operator">=</span> <span class="token function">randomFileName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

co_await <span class="token function">saveInCacheAsync</span><span class="token punctuation">(</span>p<span class="token punctuation">,</span> text<span class="token punctuation">)</span><span class="token punctuation">;</span>

co_return p<span class="token punctuation">;</span>

}

Как корутина переписывается компилятором

ret_type answer() {
	struct frame_type {
		generator<int>::promise_type promise;
		//local
		//resume point
	}
	frame_type *f = create_frame();
	auto &p = 
	new(ret_address) ret_tupe(p.get_return_object());
	co_await p.initial_suspend();
	try {
		p.return_value(42);
	} catch (...) {
<span class="token punctuation">}</span>

}

P.s
Эту херню так просто не поймешь
Гор Нишанов, C++ Coroutines – a negative overhead abstraction - вот что посмотреть надо