Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
Please login to access the resource
home:MaxxedSUSE:Compiler-Tools-15.6
libqt4
0001-Redo-the-Q_FOREACH-loop-control-without-GC...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0001-Redo-the-Q_FOREACH-loop-control-without-GCC-statemen.patch of Package libqt4
From c35a3f519007af44c3b364b9af86f6a336f6411b Mon Sep 17 00:00:00 2001 From: Thiago Macieira <thiago.macieira@intel.com> Date: Tue, 11 Feb 2014 16:17:46 -0800 Subject: [PATCH] Redo the Q_FOREACH loop control without GCC statement expressions It's possible to do without them, which probably makes the number of supported compilers a lot bigger: they just need to support decltype() or __typeof__. That includes the Intel compiler. The old code was also apparently working, but no one had realized the old workaround for some old version was still in place. The loop overhead is more or less the same. I have not done benchmarks, but inspection of the generated assembly shows more or less the same number of instructions. Change-Id: I32d499c84a6ddd19d994b49f17a469acb5c3a3f1 Reviewed-by: Olivier Goffart <ogoffart@woboq.com> Reviewed-by: Marc Mutz <marc.mutz@kdab.com> --- src/corelib/global/qglobal.h | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) Index: qt-everywhere-opensource-src-4.8.7/src/corelib/global/qglobal.h =================================================================== --- qt-everywhere-opensource-src-4.8.7.orig/src/corelib/global/qglobal.h +++ qt-everywhere-opensource-src-4.8.7/src/corelib/global/qglobal.h @@ -2483,22 +2483,32 @@ typedef uint Flags; #endif /* Q_NO_TYPESAFE_FLAGS */ -#if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_CC_RVCT) +#if (defined(Q_CC_GNU) && !defined(Q_CC_RVCT)) /* make use of typeof-extension */ template <typename T> class QForeachContainer { public: - inline QForeachContainer(const T& t) : c(t), brk(0), i(c.begin()), e(c.end()) { } + inline QForeachContainer(const T& t) : c(t), i(c.begin()), e(c.end()), control(1) { } const T c; int brk; typename T::const_iterator i, e; + int control; }; -#define Q_FOREACH(variable, container) \ -for (QForeachContainer<__typeof__(container)> _container_(container); \ - !_container_.brk && _container_.i != _container_.e; \ - __extension__ ({ ++_container_.brk; ++_container_.i; })) \ - for (variable = *_container_.i;; __extension__ ({--_container_.brk; break;})) +// Explanation of the control word: +// - it's initialized to 1 +// - that means both the inner and outer loops start +// - if there were no breaks, at the end of the inner loop, it's set to 0, which +// causes it to exit (the inner loop is run exactly once) +// - at the end of the outer loop, it's inverted, so it becomes 1 again, allowing +// the outer loop to continue executing +// - if there was a break inside the inner loop, it will exit with control still +// set to 1; in that case, the outer loop will invert it to 0 and will exit too +# define Q_FOREACH(variable, container) \ +for (QForeachContainer<__typeof__((container))> _container_((container)); \ + _container_.control && _container_.i != _container_.e; \ + ++_container_.i, _container_.control ^= 1) \ + for (variable = *_container_.i; _container_.control; _container_.control = 0) #else
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor