From 54e3332673808502575e996b7c70b7dcad606036 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sun, 6 Jun 2021 22:36:26 -0400 Subject: [PATCH] Ensure optionals appear at the end of any ROM request list. --- Machines/Utility/ROMCatalogue.cpp | 3 +++ Machines/Utility/ROMCatalogue.hpp | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/Machines/Utility/ROMCatalogue.cpp b/Machines/Utility/ROMCatalogue.cpp index 5b2d1a24a..7a12069ff 100644 --- a/Machines/Utility/ROMCatalogue.cpp +++ b/Machines/Utility/ROMCatalogue.cpp @@ -32,6 +32,7 @@ Request Request::append(Node::Type type, const Request &rhs) { if(node.type == type && rhs.node.type == type) { Request new_request = *this; new_request.node.children.insert(new_request.node.children.end(), rhs.node.children.begin(), rhs.node.children.end()); + new_request.node.sort(); return new_request; } @@ -39,6 +40,7 @@ Request Request::append(Node::Type type, const Request &rhs) { if(node.type == type && rhs.node.type == Node::Type::One) { Request new_request = *this; new_request.node.children.push_back(rhs.node); + new_request.node.sort(); return new_request; } @@ -46,6 +48,7 @@ Request Request::append(Node::Type type, const Request &rhs) { if(rhs.node.type == type && node.type == Node::Type::One) { Request new_request = rhs; new_request.node.children.push_back(node); + new_request.node.sort(); return new_request; } diff --git a/Machines/Utility/ROMCatalogue.hpp b/Machines/Utility/ROMCatalogue.hpp index c3d541915..88ec7ca5b 100644 --- a/Machines/Utility/ROMCatalogue.hpp +++ b/Machines/Utility/ROMCatalogue.hpp @@ -9,6 +9,7 @@ #ifndef ROMCatalogue_hpp #define ROMCatalogue_hpp +#include #include #include #include @@ -244,6 +245,19 @@ struct Request { const std::function &add_item ) const; bool subtract(const ROM::Map &map); + void sort() { + // Don't do a full sort, but move anything optional to the back. + // This makes them print more nicely; it's a human-facing tweak only. + ssize_t index = ssize_t(children.size() - 1); + bool has_seen_non_optional = false; + while(index >= 0) { + has_seen_non_optional |= !children[size_t(index)].is_optional; + if(children[size_t(index)].is_optional && has_seen_non_optional) { + std::rotate(children.begin() + index, children.begin() + index + 1, children.end()); + } + --index; + } + } }; Node node;