Implement reversed template for reversing for-each loops

This commit is contained in:
Rangi
2025-10-06 16:50:47 -04:00
parent fba0562650
commit 02c2408f58
4 changed files with 27 additions and 6 deletions

View File

@@ -12,6 +12,26 @@
#include <unordered_map> #include <unordered_map>
#include <utility> #include <utility>
template<typename T>
struct ReversedIterable {
T &_iterable;
};
template<typename T>
auto begin(ReversedIterable<T> r) {
return std::rbegin(r._iterable);
}
template<typename T>
auto end(ReversedIterable<T> r) {
return std::rend(r._iterable);
}
template<typename T>
ReversedIterable<T> reversed(T &&_iterable) {
return {_iterable};
}
template<typename T> template<typename T>
class InsertionOrderedMap { class InsertionOrderedMap {
std::deque<T> list; std::deque<T> list;

View File

@@ -20,6 +20,7 @@
#include "backtrace.hpp" #include "backtrace.hpp"
#include "helpers.hpp" #include "helpers.hpp"
#include "itertools.hpp" // reversed
#include "linkdefs.hpp" #include "linkdefs.hpp"
#include "platform.hpp" // strncasecmp #include "platform.hpp" // strncasecmp
#include "verbosity.hpp" #include "verbosity.hpp"
@@ -295,9 +296,9 @@ static void
} }
if (macro.src->type == NODE_REPT) { if (macro.src->type == NODE_REPT) {
std::vector<uint32_t> const &srcIters = macro.src->iters(); std::vector<uint32_t> 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(NODE_SEPARATOR REPT_NODE_PREFIX);
fileInfoName.append(std::to_string(srcIters[i])); fileInfoName.append(std::to_string(iter));
} }
} }
fileInfoName.append(NODE_SEPARATOR); fileInfoName.append(NODE_SEPARATOR);

View File

@@ -184,8 +184,8 @@ static void writeFileStackNode(FileStackNode const &node, FILE *file) {
putLong(nodeIters.size(), file); putLong(nodeIters.size(), file);
// Iters are stored by decreasing depth, so reverse the order for output // Iters are stored by decreasing depth, so reverse the order for output
for (uint32_t i = nodeIters.size(); i--;) { for (uint32_t iter : reversed(nodeIters)) {
putLong(nodeIters[i], file); putLong(iter, file);
} }
} }
} }

View File

@@ -484,8 +484,8 @@ void obj_ReadFile(char const *fileName, unsigned int fileID) {
tryReadLong(nbNodes, file, "%s: Cannot read number of nodes: %s", fileName); tryReadLong(nbNodes, file, "%s: Cannot read number of nodes: %s", fileName);
nodes[fileID].resize(nbNodes); nodes[fileID].resize(nbNodes);
verbosePrint(VERB_INFO, "Reading %u nodes...\n", nbNodes); verbosePrint(VERB_INFO, "Reading %u nodes...\n", nbNodes);
for (uint32_t i = nbNodes; i--;) { for (uint32_t nodeID = nbNodes; nodeID--;) {
readFileStackNode(file, nodes[fileID], i, fileName); readFileStackNode(file, nodes[fileID], nodeID, fileName);
} }
// This file's symbols, kept to link sections to them // This file's symbols, kept to link sections to them