QPointingDevice: avoid double lookup in Private::pointById()
Use the newly-added try_emplace() function, to work around Qt's
associative container's broken insert() behavior (which is
equivalent to STL's insert_or_assign()), forcing either a double
lookup:
auto it = c.find(key); // lookup 1
if (it == c.end())
c.insert(key, ~~~); // lookup 2
or the usual size-check trick:
const auto oldSize = c.size();
auto &e = c[key];
if (c.size() != oldSize) {
// newly inserted
onto any lookup-or-initialize-like code. try_emplace beats them
both in terms of efficiency and readability.
Pick-to: 6.3
Change-Id: I4c52d2f2d5175991db4931d29c688de125f5b032
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
bb10
parent
d4611ba3a5
commit
66a183298a
|
|
@ -422,13 +422,12 @@ QPointingDevicePrivate::EventPointData *QPointingDevicePrivate::queryPointById(i
|
|||
*/
|
||||
QPointingDevicePrivate::EventPointData *QPointingDevicePrivate::pointById(int id) const
|
||||
{
|
||||
auto it = activePoints.find(id);
|
||||
if (it == activePoints.end()) {
|
||||
const auto [it, inserted] = activePoints.try_emplace(id);
|
||||
if (inserted) {
|
||||
Q_Q(const QPointingDevice);
|
||||
QPointingDevicePrivate::EventPointData epd;
|
||||
auto &epd = it.value();
|
||||
QMutableEventPoint::setId(epd.eventPoint, id);
|
||||
QMutableEventPoint::setDevice(epd.eventPoint, q);
|
||||
return &activePoints.insert(id, epd).first.value();
|
||||
}
|
||||
return &it.value();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue