+void Paragraph::Pimpl::setChange(pos_type pos, Change const & change)
+{
+ BOOST_ASSERT(pos >= 0 && pos <= size());
+
+ changes_.set(change, pos);
+
+ // see comment in setChange(Change const &) above
+
+ if (change.type != Change::DELETED &&
+ pos < size() && owner_->isInset(pos)) {
+ owner_->getInset(pos)->setChange(change);
+ }
+}
+
+
+Change const Paragraph::Pimpl::lookupChange(pos_type pos) const
+{
+ BOOST_ASSERT(pos >= 0 && pos <= size());
+
+ return changes_.lookup(pos);
+}
+
+
+void Paragraph::Pimpl::acceptChanges(pos_type start, pos_type end)
+{
+ BOOST_ASSERT(start >= 0 && start <= size());
+ BOOST_ASSERT(end > start && end <= size() + 1);
+
+ for (pos_type pos = start; pos < end; ++pos) {
+ switch (lookupChange(pos).type) {
+ case Change::UNCHANGED:
+ break;
+
+ case Change::INSERTED:
+ changes_.set(Change(Change::UNCHANGED), pos);
+ break;
+
+ case Change::DELETED:
+ // Suppress access to non-existent
+ // "end-of-paragraph char"
+ if (pos < size()) {
+ eraseChar(pos, false);
+ --end;
+ --pos;
+ }
+ break;
+ }
+
+ // also accept changes in nested insets
+ if (pos < size() && owner_->isInset(pos)) {
+ owner_->getInset(pos)->acceptChanges();
+ }
+ }
+}
+
+
+void Paragraph::Pimpl::rejectChanges(pos_type start, pos_type end)