Здравствуйте, smeeld, Вы писали:
S>>Глаза разуйте: у вас нет ничего после else. Ваш while имеет вот такой вид:
S>Это вы глаза разуйте. Это что? Пушкин?
S>S> node_descp->set_current_storage_chunk(node_descp->get_current_storage_chunk());
S> node_descp->set_shared_segment(journal_store(node_descp->get_current_storage_chunk()).first_descriptor_shared());
S>
Это находится не после else. А внутри. И continue ваш идет после этих строк. Вот еще раз вам, раз вы в собственном коде запутались:
while(journal_store(node_descp->get_current_storage_chunk()).shared_descriptor_count() == 0){
if(node_descp->get_current_storage_chunk() >= get_journal_storage_chunk_count()){
break;
}
else {
node_descp->set_current_storage_chunk(node_descp->get_current_storage_chunk());
node_descp->set_shared_segment(journal_store(node_descp->get_current_storage_chunk()).first_descriptor_shared());
continue; // ВОТ ОН. ЗДЕСЬ!
} // А дальше, после else, ничего нет.
}
S>>Было очевидно, что вы не пробовали. Пропробовали бы, то увидели бы, что ваш основной код внутри первого while сократился бы раза в 1.5. Что сделало бы его понятнее.
S>Ещё раз гляньте выше. Там лямбды вообще не к месту, и только синтаксического хлама добавят.
Да давно бы уже отрефакторил ваш код еще раз. Специально, чтобы показать насколько компактнее он может быть. Но споткнулся об этот вложенный while, логика которого доступна разве что вам.
S>Я то понимаю, боюсь что Вы всё никак не допрёте.
Попробуйте сами простыню чужого говнокода без комментариев и со стремной логикой сходу понять.
S>>Если у вас get_current_storage_chunk() не является идемпотентной операцией, т.е. get_current_storage_chunk() каждый раз возвращает разное значение
S>Между вызовом set, get возвращает одно и то же значение, после-другое. Это очевидно, Карл!
Да вы просто не понимаете о чем вам говорят. Давайте, раз уж вы настолько тяжелый случай, на пальцах вам объясним:
class Demo {
int v_{};
public:
void set_v(int v) { v_ = v; }
int get_v() const noexcept { return v_; }
};
Demo d;
d.set_v(10); // В этом есть смысл.
assert(10 == d.get_v()); // И в этом есть смысл.
d.set_v(d.get_v()); // А в этом уже смысла нет.
Смысла в строке d.set_v(d.get_v()) нет потому, что get_v не может вернуть значение, отличное от того, что раньше было назначено через set_v.
Вреда от этого так же нет. Это бессмысленная операция.
Но у вас set_current_storage_chunk для get_current_storage_chunk имеет смысл. Что говорит о том, что get_current_storage_chunk может вернуть значение, отличное от того, что раньше было установлено через set_current_storage_chunk. Либо значение current_storage_chunk может поменяться вообще без применения set_current_storage_chunk.
И то, и другое выглядит крайне странно.
Но у вас, очевидно, собственная логика. В ее рамках все нормально.
S>В общем, это Вы не въезжаете в достаточно очевидные вещи, которые там расписаны чёрным по белому, ясней некуда. Но до Вас это всё никак не доходит. Может это пованивает не от кода. а от Ваших умственных способностей?
Очевидно, что мои умственные способности уступают вашим. Т.к. я не вижу в коде ничего понятного и простого. А вот нежелание упростить и сделать понятнее и компактнее налицо.
PS. По большому счету, весь ваш вложенный while можно было бы записать так:
while((journal_store(node_descp->get_current_storage_chunk()).shared_descriptor_count() == 0) &&
(node_descp->get_current_storage_chunk() < get_journal_storage_chunk_count())
{
node_descp->set_current_storage_chunk(node_descp->get_current_storage_chunk());
node_descp->set_shared_segment(journal_store(node_descp->get_current_storage_chunk()).first_descriptor_shared());
}