QWaylandScanner: port from QList to std::vector

QList is going away in Qt 6, and CoW is not needed, as containers and
elements are only ever moved, not copied, and NRVO is in effect
everywhere.

Change-Id: Ie738da3619f0b8048fbd07e5911db0960133d553
Reviewed-by: Johan Helsing <johan.helsing@qt.io>
This commit is contained in:
Marc Mutz 2019-07-25 10:40:21 +03:00
parent ff42bda500
commit 738d8a57b1

View File

@ -40,7 +40,8 @@
#include <QCoreApplication> #include <QCoreApplication>
#include <QFile> #include <QFile>
#include <QXmlStreamReader> #include <QXmlStreamReader>
#include <QtCore/QList>
#include <vector>
class Scanner class Scanner
{ {
@ -63,7 +64,7 @@ private:
struct WaylandEnum { struct WaylandEnum {
QByteArray name; QByteArray name;
QList<WaylandEnumEntry> entries; std::vector<WaylandEnumEntry> entries;
}; };
struct WaylandArgument { struct WaylandArgument {
@ -78,16 +79,16 @@ private:
bool request; bool request;
QByteArray name; QByteArray name;
QByteArray type; QByteArray type;
QList<WaylandArgument> arguments; std::vector<WaylandArgument> arguments;
}; };
struct WaylandInterface { struct WaylandInterface {
QByteArray name; QByteArray name;
int version; int version;
QList<WaylandEnum> enums; std::vector<WaylandEnum> enums;
QList<WaylandEvent> events; std::vector<WaylandEvent> events;
QList<WaylandEvent> requests; std::vector<WaylandEvent> requests;
}; };
bool isServerSide(); bool isServerSide();
@ -101,11 +102,11 @@ private:
Scanner::WaylandInterface readInterface(QXmlStreamReader &xml); Scanner::WaylandInterface readInterface(QXmlStreamReader &xml);
QByteArray waylandToCType(const QByteArray &waylandType, const QByteArray &interface); QByteArray waylandToCType(const QByteArray &waylandType, const QByteArray &interface);
QByteArray waylandToQtType(const QByteArray &waylandType, const QByteArray &interface, bool cStyleArray); QByteArray waylandToQtType(const QByteArray &waylandType, const QByteArray &interface, bool cStyleArray);
const Scanner::WaylandArgument *newIdArgument(const QList<WaylandArgument> &arguments); const Scanner::WaylandArgument *newIdArgument(const std::vector<WaylandArgument> &arguments);
void printEvent(const WaylandEvent &e, bool omitNames = false, bool withResource = false); void printEvent(const WaylandEvent &e, bool omitNames = false, bool withResource = false);
void printEventHandlerSignature(const WaylandEvent &e, const char *interfaceName, bool deepIndent = true); void printEventHandlerSignature(const WaylandEvent &e, const char *interfaceName, bool deepIndent = true);
void printEnums(const QList<WaylandEnum> &enums); void printEnums(const std::vector<WaylandEnum> &enums);
QByteArray stripInterfaceName(const QByteArray &name); QByteArray stripInterfaceName(const QByteArray &name);
bool ignoreInterface(const QByteArray &name); bool ignoreInterface(const QByteArray &name);
@ -204,7 +205,7 @@ Scanner::WaylandEvent Scanner::readEvent(QXmlStreamReader &xml, bool request)
.summary = byteArrayValue(xml, "summary"), .summary = byteArrayValue(xml, "summary"),
.allowNull = boolValue(xml, "allowNull"), .allowNull = boolValue(xml, "allowNull"),
}; };
event.arguments << argument; event.arguments.push_back(std::move(argument));
} }
xml.skipCurrentElement(); xml.skipCurrentElement();
@ -226,7 +227,7 @@ Scanner::WaylandEnum Scanner::readEnum(QXmlStreamReader &xml)
.value = byteArrayValue(xml, "value"), .value = byteArrayValue(xml, "value"),
.summary = byteArrayValue(xml, "summary"), .summary = byteArrayValue(xml, "summary"),
}; };
result.entries << entry; result.entries.push_back(std::move(entry));
} }
xml.skipCurrentElement(); xml.skipCurrentElement();
@ -247,11 +248,11 @@ Scanner::WaylandInterface Scanner::readInterface(QXmlStreamReader &xml)
while (xml.readNextStartElement()) { while (xml.readNextStartElement()) {
if (xml.name() == "event") if (xml.name() == "event")
interface.events << readEvent(xml, false); interface.events.push_back(readEvent(xml, false));
else if (xml.name() == "request") else if (xml.name() == "request")
interface.requests << readEvent(xml, true); interface.requests.push_back(readEvent(xml, true));
else if (xml.name() == "enum") else if (xml.name() == "enum")
interface.enums << readEnum(xml); interface.enums.push_back(readEnum(xml));
else else
xml.skipCurrentElement(); xml.skipCurrentElement();
} }
@ -293,7 +294,7 @@ QByteArray Scanner::waylandToQtType(const QByteArray &waylandType, const QByteAr
return waylandToCType(waylandType, interface); return waylandToCType(waylandType, interface);
} }
const Scanner::WaylandArgument *Scanner::newIdArgument(const QList<WaylandArgument> &arguments) const Scanner::WaylandArgument *Scanner::newIdArgument(const std::vector<WaylandArgument> &arguments)
{ {
for (const WaylandArgument &a : arguments) { for (const WaylandArgument &a : arguments) {
if (a.type == "new_id") if (a.type == "new_id")
@ -368,7 +369,7 @@ void Scanner::printEventHandlerSignature(const WaylandEvent &e, const char *inte
printf(")"); printf(")");
} }
void Scanner::printEnums(const QList<WaylandEnum> &enums) void Scanner::printEnums(const std::vector<WaylandEnum> &enums)
{ {
for (const WaylandEnum &e : enums) { for (const WaylandEnum &e : enums) {
printf("\n"); printf("\n");
@ -428,11 +429,11 @@ bool Scanner::process()
//QByteArray preProcessorProtocolName = QByteArray(m_protocolName).replace('-', '_').toUpper(); //QByteArray preProcessorProtocolName = QByteArray(m_protocolName).replace('-', '_').toUpper();
QByteArray preProcessorProtocolName = QByteArray(m_protocolName).toUpper(); QByteArray preProcessorProtocolName = QByteArray(m_protocolName).toUpper();
QList<WaylandInterface> interfaces; std::vector<WaylandInterface> interfaces;
while (m_xml->readNextStartElement()) { while (m_xml->readNextStartElement()) {
if (m_xml->name() == "interface") if (m_xml->name() == "interface")
interfaces << readInterface(*m_xml); interfaces.push_back(readInterface(*m_xml));
else else
m_xml->skipCurrentElement(); m_xml->skipCurrentElement();
} }
@ -546,7 +547,7 @@ bool Scanner::process()
printEnums(interface.enums); printEnums(interface.enums);
bool hasEvents = !interface.events.isEmpty(); bool hasEvents = !interface.events.empty();
if (hasEvents) { if (hasEvents) {
printf("\n"); printf("\n");
@ -567,7 +568,7 @@ bool Scanner::process()
printf(" virtual void %s_bind_resource(Resource *resource);\n", interfaceNameStripped); printf(" virtual void %s_bind_resource(Resource *resource);\n", interfaceNameStripped);
printf(" virtual void %s_destroy_resource(Resource *resource);\n", interfaceNameStripped); printf(" virtual void %s_destroy_resource(Resource *resource);\n", interfaceNameStripped);
bool hasRequests = !interface.requests.isEmpty(); bool hasRequests = !interface.requests.empty();
if (hasRequests) { if (hasRequests) {
printf("\n"); printf("\n");
@ -781,7 +782,7 @@ bool Scanner::process()
printf(" }\n"); printf(" }\n");
printf("\n"); printf("\n");
bool hasRequests = !interface.requests.isEmpty(); bool hasRequests = !interface.requests.empty();
QByteArray interfaceMember = hasRequests ? "&m_" + interface.name + "_interface" : QByteArray("nullptr"); QByteArray interfaceMember = hasRequests ? "&m_" + interface.name + "_interface" : QByteArray("nullptr");
@ -997,7 +998,7 @@ bool Scanner::process()
printEnums(interface.enums); printEnums(interface.enums);
if (!interface.requests.isEmpty()) { if (!interface.requests.empty()) {
printf("\n"); printf("\n");
for (const WaylandEvent &e : interface.requests) { for (const WaylandEvent &e : interface.requests) {
const WaylandArgument *new_id = newIdArgument(e.arguments); const WaylandArgument *new_id = newIdArgument(e.arguments);
@ -1014,7 +1015,7 @@ bool Scanner::process()
} }
} }
bool hasEvents = !interface.events.isEmpty(); bool hasEvents = !interface.events.empty();
if (hasEvents) { if (hasEvents) {
printf("\n"); printf("\n");
@ -1092,7 +1093,7 @@ bool Scanner::process()
QByteArray stripped = stripInterfaceName(interface.name); QByteArray stripped = stripInterfaceName(interface.name);
const char *interfaceNameStripped = stripped.constData(); const char *interfaceNameStripped = stripped.constData();
bool hasEvents = !interface.events.isEmpty(); bool hasEvents = !interface.events.empty();
printf(" %s::%s(struct ::wl_registry *registry, int id, int version)\n", interfaceName, interfaceName); printf(" %s::%s(struct ::wl_registry *registry, int id, int version)\n", interfaceName, interfaceName);
printf(" {\n"); printf(" {\n");
@ -1182,7 +1183,7 @@ bool Scanner::process()
printf(" %s.alloc = 0;\n", arrayName); printf(" %s.alloc = 0;\n", arrayName);
printf("\n"); printf("\n");
} }
int actualArgumentCount = new_id ? e.arguments.size() - 1 : e.arguments.size(); int actualArgumentCount = new_id ? int(e.arguments.size()) - 1 : int(e.arguments.size());
printf(" %s%s_%s(\n", new_id ? "return " : "", interfaceName, e.name.constData()); printf(" %s%s_%s(\n", new_id ? "return " : "", interfaceName, e.name.constData());
printf(" m_%s%s", interfaceName, actualArgumentCount > 0 ? "," : ""); printf(" m_%s%s", interfaceName, actualArgumentCount > 0 ? "," : "");
bool needsComma = false; bool needsComma = false;