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