http://bugzilla.lyx.org/show_bug.cgi?id=1920

It would be nice if someone could test this.

The problem was that when deleting paragraphs as part of a cut, we
delete the paragraphs one-by-one from the beginning of the
paragraphlist vector. This results in a huge amount of memory moves.
This patch fixes that by just erasing all the paragraphs in one go.

Index: src/CutAndPaste.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/CutAndPaste.C,v
retrieving revision 1.154
diff -u -p -r1.154 CutAndPaste.C
--- src/CutAndPaste.C	16 Jul 2005 15:22:07 -0000	1.154
+++ src/CutAndPaste.C	19 Jul 2005 09:39:41 -0000
@@ -253,40 +253,33 @@ PitPosPair eraseSelectionHelper(BufferPa
 	pit_type startpit, pit_type endpit,
 	int startpos, int endpos, bool doclear)
 {
+        // Start of selection is really invalid.
 	if (startpit == pit_type(pars.size()) ||
 	    (startpos > pars[startpit].size()))
 		return PitPosPair(endpit, endpos);
 
+        // Start and end is inside same paragraph
 	if (endpit == pit_type(pars.size()) ||
 	    startpit == endpit) {
 		endpos -= pars[startpit].erase(startpos, endpos);
 		return PitPosPair(endpit, endpos);
 	}
 
-	// clear end/begin fragments of the first/last par in selection
 	bool all_erased = true;
 
+        // Clear fragments of the first par in selection
 	pars[startpit].erase(startpos, pars[startpit].size());
 	if (pars[startpit].size() != startpos)
 		all_erased = false;
 
+        // Clear fragments of the last par in selection
 	endpos -= pars[endpit].erase(0, endpos);
 	if (endpos != 0)
 		all_erased = false;
 
-	// Loop through the deleted pars if any, erasing as needed
-	for (pit_type pit = startpit + 1; pit != endpit;) {
-		// "erase" the contents of the par
-		pars[pit].erase(0, pars[pit].size());
-		if (!pars[pit].size()) {
-			// remove the par if it's now empty
-			pars.erase(pars.begin() + pit);
-			--endpit;
-		} else {
-			++pit;
-			all_erased = false;
-		}
-	}
+        // Erase all the "middle" paragraphs.
+        pars.erase(pars.begin() + startpit + 1, pars.begin() + endpit);
+        endpit = startpit + 1;
 
 #if 0 // FIXME: why for cut but not copy ?
 	// the cut selection should begin with standard layout
@@ -304,18 +297,17 @@ PitPosPair eraseSelectionHelper(BufferPa
 		pars[startpit + 1].stripLeadingSpaces();
 	}
 
-	// paste the paragraphs again, if possible
+	// Merge first and last paragraph, if possible
 	if (all_erased &&
 	    (pars[startpit].hasSameLayout(pars[startpit + 1]) ||
 	     pars[startpit + 1].empty())) {
 		mergeParagraph(params, pars, startpit);
-		// this because endpar gets deleted here!
+		// This because endpar gets deleted here!
 		endpit = startpit;
 		endpos = startpos;
 	}
 
 	return PitPosPair(endpit, endpos);
-
 }
 
 
@@ -329,6 +321,7 @@ void copySelectionHelper(ParagraphList &
 
 	// Clone the paragraphs within the selection.
 	ParagraphList paragraphs(pars.begin() + startpit, pars.begin() + endpit + 1);
+
 	for_each(paragraphs.begin(), paragraphs.end(), resetOwnerAndChanges());
 
 	// Cut out the end of the last paragraph.
@@ -342,18 +335,6 @@ void copySelectionHelper(ParagraphList &
 	theCuts.push(make_pair(paragraphs, tc));
 }
 
-
-
-PitPosPair cutSelectionHelper(BufferParams const & params,
-	ParagraphList & pars, pit_type startpit, pit_type endpit,
-	int startpos, int endpos, textclass_type tc, bool doclear)
-{
-	copySelectionHelper(pars, startpit, endpit, startpos, endpos, tc);
-	return eraseSelectionHelper(params, pars, startpit, endpit,
-		startpos, endpos, doclear);
-}
-
-
 } // namespace anon
 
 
@@ -490,7 +471,7 @@ void cutSelection(LCursor & cur, bool do
 		// finished. The solution used currently just works, to make it
 		// faster we need to be more clever and probably also have more
 		// calls to stuffClipboard. (Lgb)
-		cur.bv().stuffClipboard(cur.selectionAsString(true));
+//		cur.bv().stuffClipboard(cur.selectionAsString(true));
 
 		// This doesn't make sense, if there is no selection
 		if (!cur.selection())
@@ -615,10 +596,10 @@ void pasteSelection(LCursor & cur, size_
 
 		boost::tie(ppp, endpit) =
 			pasteSelectionHelper(cur.buffer(),
-								text->paragraphs(),
-								cur.pit(), cur.pos(),
-								cur.buffer().params().textclass,
-								sel_index, el);
+                                             text->paragraphs(),
+                                             cur.pit(), cur.pos(),
+                                             cur.buffer().params().textclass,
+                                             sel_index, el);
 		bufferErrors(cur.buffer(), el);
 		cur.bv().showErrorList(_("Paste"));
 
-- 
        Lgb

Reply via email to