From 02c2408f5815c038fdfa01ef17cf5f5779001f06 Mon Sep 17 00:00:00 2001 From: Rangi Date: Mon, 6 Oct 2025 16:50:47 -0400 Subject: [PATCH] Implement `reversed` template for reversing `for`-each loops --- include/itertools.hpp | 20 ++++++++++++++++++++ src/asm/fstack.cpp | 5 +++-- src/asm/output.cpp | 4 ++-- src/link/object.cpp | 4 ++-- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/include/itertools.hpp b/include/itertools.hpp index b1d0d32a..a361b2e0 100644 --- a/include/itertools.hpp +++ b/include/itertools.hpp @@ -12,6 +12,26 @@ #include #include +template +struct ReversedIterable { + T &_iterable; +}; + +template +auto begin(ReversedIterable r) { + return std::rbegin(r._iterable); +} + +template +auto end(ReversedIterable r) { + return std::rend(r._iterable); +} + +template +ReversedIterable reversed(T &&_iterable) { + return {_iterable}; +} + template class InsertionOrderedMap { std::deque list; diff --git a/src/asm/fstack.cpp b/src/asm/fstack.cpp index 2c614fce..6707a0ca 100644 --- a/src/asm/fstack.cpp +++ b/src/asm/fstack.cpp @@ -20,6 +20,7 @@ #include "backtrace.hpp" #include "helpers.hpp" +#include "itertools.hpp" // reversed #include "linkdefs.hpp" #include "platform.hpp" // strncasecmp #include "verbosity.hpp" @@ -295,9 +296,9 @@ static void } if (macro.src->type == NODE_REPT) { std::vector const &srcIters = macro.src->iters(); - for (uint32_t i = srcIters.size(); i--;) { + for (uint32_t iter : reversed(srcIters)) { fileInfoName.append(NODE_SEPARATOR REPT_NODE_PREFIX); - fileInfoName.append(std::to_string(srcIters[i])); + fileInfoName.append(std::to_string(iter)); } } fileInfoName.append(NODE_SEPARATOR); diff --git a/src/asm/output.cpp b/src/asm/output.cpp index 93d88bae..fbbbfd85 100644 --- a/src/asm/output.cpp +++ b/src/asm/output.cpp @@ -184,8 +184,8 @@ static void writeFileStackNode(FileStackNode const &node, FILE *file) { putLong(nodeIters.size(), file); // Iters are stored by decreasing depth, so reverse the order for output - for (uint32_t i = nodeIters.size(); i--;) { - putLong(nodeIters[i], file); + for (uint32_t iter : reversed(nodeIters)) { + putLong(iter, file); } } } diff --git a/src/link/object.cpp b/src/link/object.cpp index 0f3650eb..22bee505 100644 --- a/src/link/object.cpp +++ b/src/link/object.cpp @@ -484,8 +484,8 @@ void obj_ReadFile(char const *fileName, unsigned int fileID) { tryReadLong(nbNodes, file, "%s: Cannot read number of nodes: %s", fileName); nodes[fileID].resize(nbNodes); verbosePrint(VERB_INFO, "Reading %u nodes...\n", nbNodes); - for (uint32_t i = nbNodes; i--;) { - readFileStackNode(file, nodes[fileID], i, fileName); + for (uint32_t nodeID = nbNodes; nodeID--;) { + readFileStackNode(file, nodes[fileID], nodeID, fileName); } // This file's symbols, kept to link sections to them