Use swap in InsetText::updateBuffer for notes ad friends

Avoid as much as possible to do full copies of all counters, since
that can be exensive. Unfortunately, it is just posible when we want
to restore the saved counters.

Explanations why we use friend swap is here:
https://stackoverflow.com/questions/5695548/public-friend-swap-member-function

Part of bug #5973.
This commit is contained in:
Jean-Marc Lasgouttes 2018-07-21 23:58:47 +02:00
parent 4549f46a43
commit 05d3a64952
3 changed files with 13 additions and 2 deletions

View File

@ -697,4 +697,12 @@ void Counters::endEnvironment()
}
void swap(Counters & c1, Counters & c2)
{
Counters tmp = move(c1);
c1 = move(c2);
c2 = move(tmp);
}
} // namespace lyx

View File

@ -239,6 +239,9 @@ private:
std::vector<docstring> counter_stack_;
/// Same, but for last layout.
std::vector<Layout const *> layout_stack_;
///
friend void swap(Counters &, Counters &);
};
} // namespace lyx

View File

@ -814,13 +814,13 @@ void InsetText::updateBuffer(ParIterator const & it, UpdateType utype)
// Note that we do not need to call:
// tclass.counters().clearLastLayout()
// since we are saving and restoring the existing counters, etc.
Counters const savecnt = tclass.counters();
Counters savecnt = tclass.counters();
tclass.counters().reset();
// we need float information even in note insets (#9760)
tclass.counters().current_float(savecnt.current_float());
tclass.counters().isSubfloat(savecnt.isSubfloat());
buffer().updateBuffer(it2, utype);
tclass.counters() = savecnt;
swap(tclass.counters(), savecnt);
}
}