Skip to content

Commit

Permalink
refactor: drop foreach/Q_FOREACH
Browse files Browse the repository at this point in the history
Use C++11 range for. Making the container const or using qAsConst() to cast
to const, so that container detachments are avoided.
Enforce it by adding QT_NO_FOREACH to the compilation definitions.

Rationale:
* Since Qt 5.7, the use of this macro is discouraged. It will be removed
  in a future version of Qt.
* It only works efficiently on (some) Qt containers; it performs
  prohibitively expensive on all std containers, QVarLengthArray, and
  doesn’t work at all for C arrays.
* Even where it works as advertised, it typically costs ~100 bytes of text
  size more per loop than the C++11 ranged for-loop.
* Its unconditionally taking a copy of the container makes it hard to
  reason about the loop.

[1]: https://www.kdab.com/goodbye-q_foreach/
  • Loading branch information
CoelacanthusHex committed Nov 11, 2020
1 parent 09d58f1 commit 1cfca7c
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 19 deletions.
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ else()
set(QT_MAJOR_VERSION 5)
endif()

add_definitions(-DQT_NO_FOREACH)

find_package(${LEMON_QT_LIBNAME} ${LEMON_QT_MAJOR_VERSION}.${LEMON_QT_MINOR_VERSION} COMPONENTS Core Gui Widgets REQUIRED)
list(APPEND LEMON_QT_LIBS ${LEMON_QT_LIBNAME}::Core ${LEMON_QT_LIBNAME}::Gui ${LEMON_QT_LIBNAME}::Widgets)

Expand Down
2 changes: 1 addition & 1 deletion makespec/BUILDVERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
94
96
28 changes: 10 additions & 18 deletions src/lemon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -261,9 +261,8 @@ void removePath(const QString &path) {
return;

dir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot | QDir::Hidden);
QFileInfoList fileList = dir.entryInfoList();

foreach (QFileInfo fi, fileList) {
for (const auto &fi : dir.entryInfoList()) {
if (fi.isFile() || fi.isSymLink())
fi.dir().remove(fi.fileName());
else
Expand All @@ -282,9 +281,8 @@ void copyPath(const QString &fromPath, const QString &toPath) {
QString fpath = fromPath + QDir::separator();
QString tpath = toPath + QDir::separator();
dir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot | QDir::Hidden);
QFileInfoList fileList = dir.entryInfoList();

foreach (QFileInfo fi, fileList) {
for (const auto &fi : dir.entryInfoList()) {
QString fn = fpath + fi.fileName();
QString tn = tpath + fi.fileName();

Expand Down Expand Up @@ -354,9 +352,8 @@ void LemonLime::cleanupButtonClicked() {
bkProcess->setValue(0);
QCoreApplication::processEvents();
basDir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
basDirLis = basDir.entryInfoList();

foreach (QFileInfo conDirWho, basDirLis) {
for (const auto &conDirWho : basDir.entryInfoList()) {
bkLoca.mkpath(conDirWho.fileName());
copyPath(conDirWho.path() + QDir::separator() + conDirWho.fileName(),
bkLoca.path() + QDir::separator() + conDirWho.fileName());
Expand Down Expand Up @@ -421,27 +418,24 @@ void LemonLime::cleanupButtonClicked() {
process->setLabelText(tr("Now Cleaning..."));
QCoreApplication::processEvents();
basDir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
basDirLis = basDir.entryInfoList();

foreach (QFileInfo conDirWho, basDirLis) {
for (const auto &conDirWho : basDir.entryInfoList()) {
QDir conDir(conDirWho.filePath());
conDir.setFilter(QDir::Files | QDir::Hidden);
QFileInfoList conDirLis = conDir.entryInfoList();

foreach (QFileInfo proFilWho, conDirLis) {
for (const auto &proFilWho : conDir.entryInfoList()) {
if (proFilWho.suffix().length() <= 0 || proFilWho.suffix().toUpper() == "EXE")
QFile::remove(proFilWho.absoluteFilePath());
}

conDir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
conDirLis = conDir.entryInfoList();

foreach (QFileInfo proDirWho, conDirLis) {
for (const auto &proDirWho : conDir.entryInfoList()) {
if (nameSet.contains(proDirWho.fileName())) {
QDir proDir(proDirWho.filePath());
proDir.setFilter(QDir::Files | QDir::Hidden);

foreach (QFileInfo sorFilWho, proDir.entryInfoList()) {
for (const auto &sorFilWho : proDir.entryInfoList()) {
if (sorFilWho.suffix().length() > 0 && sorFilWho.suffix().toUpper() != "EXE")
QFile::copy(sorFilWho.filePath(),
conDirWho.filePath() + QDir::separator() + sorFilWho.fileName());
Expand All @@ -456,9 +450,8 @@ void LemonLime::cleanupButtonClicked() {
}

conDir.setFilter(QDir::Files | QDir::Hidden);
conDirLis = conDir.entryInfoList();

foreach (QFileInfo proFilWho, conDirLis) {
for (const auto &proFilWho : conDir.entryInfoList()) {
QString proFilName = proFilWho.fileName();
QString proName = proFilName;
proName.truncate(proName.lastIndexOf("."));
Expand All @@ -485,13 +478,12 @@ void LemonLime::cleanupButtonClicked() {
}

conDir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
conDirLis = conDir.entryInfoList();

foreach (QFileInfo proDirWho, conDirLis) {
for (const auto &proDirWho : conDir.entryInfoList()) {
QDir proDir(proDirWho.filePath());
proDir.setFilter(QDir::Files | QDir::Hidden);

foreach (QFileInfo sorFilWho, proDir.entryInfoList())
for (const auto &sorFilWho : proDir.entryInfoList())
QFile::copy(sorFilWho.filePath(),
conDirWho.filePath() + QDir::separator() + sorFilWho.fileName());
}
Expand Down

0 comments on commit 1cfca7c

Please sign in to comment.