mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 18:22:07 +00:00
Implement reversed template for reversing for-each loops
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user