From 89034600939bbfe241ba3d6136abf7bb6961db52 Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Mon, 15 Feb 2016 11:16:39 +0300 Subject: QtBase: use erase and std::remove_if with QList and QVector ... instead of using removeAt in a loop, with quadratic complexity. Change-Id: I38b49e56b12c396db9fc0f1b75d8fb43c503a7f6 Reviewed-by: Marc Mutz --- src/gui/opengl/qopenglengineshadermanager.cpp | 15 +++++++++------ src/gui/text/qtextdocumentlayout.cpp | 14 ++++++-------- 2 files changed, 15 insertions(+), 14 deletions(-) (limited to 'src/gui') diff --git a/src/gui/opengl/qopenglengineshadermanager.cpp b/src/gui/opengl/qopenglengineshadermanager.cpp index 1bcb1c6760..4e3d14ba37 100644 --- a/src/gui/opengl/qopenglengineshadermanager.cpp +++ b/src/gui/opengl/qopenglengineshadermanager.cpp @@ -45,6 +45,8 @@ #include #include +#include + #if defined(QT_DEBUG) #include #endif @@ -475,15 +477,16 @@ QOpenGLEngineShaderProg *QOpenGLEngineSharedShaders::findProgramInCache(const QO void QOpenGLEngineSharedShaders::cleanupCustomStage(QOpenGLCustomShaderStage* stage) { - // Remove any shader programs which has this as the custom shader src: - for (int i = 0; i < cachedPrograms.size(); ++i) { - QOpenGLEngineShaderProg *cachedProg = cachedPrograms[i]; + auto hasStageAsCustomShaderSouce = [stage](QOpenGLEngineShaderProg *cachedProg) -> bool { if (cachedProg->customStageSource == stage->source()) { delete cachedProg; - cachedPrograms.removeAt(i); - i--; + return true; } - } + return false; + }; + cachedPrograms.erase(std::remove_if(cachedPrograms.begin(), cachedPrograms.end(), + hasStageAsCustomShaderSouce), + cachedPrograms.end()); } diff --git a/src/gui/text/qtextdocumentlayout.cpp b/src/gui/text/qtextdocumentlayout.cpp index c26fd08c41..9863955a55 100644 --- a/src/gui/text/qtextdocumentlayout.cpp +++ b/src/gui/text/qtextdocumentlayout.cpp @@ -2901,14 +2901,12 @@ static void markFrames(QTextFrame *current, int from, int oldLength, int length) return; QTextFrameData *fd = data(current); - for (int i = 0; i < fd->floats.size(); ++i) { - QTextFrame *f = fd->floats[i]; - if (!f) { - // float got removed in editing operation - fd->floats.removeAt(i); - --i; - } - } + // float got removed in editing operation + QTextFrame *null = nullptr; // work-around for (at least) MSVC 2012 emitting + // warning C4100 for its own header + // when passing nullptr directly to std::remove + fd->floats.erase(std::remove(fd->floats.begin(), fd->floats.end(), null), + fd->floats.end()); fd->layoutDirty = true; fd->sizeDirty = true; -- cgit v1.2.3