[Development] Move ctors for q_declare_shared types
Marc Mutz
marc.mutz at kdab.com
Sat Jun 27 12:05:19 CEST 2015
On Friday 26 June 2015 22:52:17 Thiago Macieira wrote:
> On Friday 26 June 2015 10:45:24 Marc Mutz wrote:
[...]
> For example: can we make the deallocation function a member of the
> front-end class, which is usually exported anyway?
We can, at the expense of an additional template argument on QtP::SDP, but
seeing as I'd like to unexport most, if not all, value classes, for the resons
repeated many times on the list and in reviews, that won't help with the
exporting.
> This would avoid the
> ugly need for two macros in a row like:
>
> Q_GUI_EXPORT Q_SHAREDDATAPOINTER_DECLARE_DTOR(QFontPrivate);
>
> Wouldn't the fact that it's a member function remove the need for the
> declaration prior to the class instantiation?
Maybe. I'll try.
> We may need a macro anyway, which I'd advise be called
> Q_DECLARE_PUBLIC_SHARED(ClassName)
What should hide behind that macro? Given a user-supplied swap, we can
generate the move assignment operators from there, but not the move
constructors (in case of more data fields, e.g. in QFont, QPalette
(resolve_mask).
> > Mid-term goal would be to have all implicitly-shared classes use the same
> > smart pointer, be nothrow move-assignable, nothrow move-constructible,
> > and nothrow *default-constructible* (which requires a trick a la QRegion
> > / QString / QVector / QList (QtPrivate::RefCount and a shared null
> > state, or else a nullptr d-pointer)), probably by Qt 5.7.
>
> Some of those classes are bigger than one pointer and/or may hold more than
> one pointer (for example, QSharedPointer).
But QSP is already nothrow default-constructible... What's the point you're
trying to make?
> I've been playing with null d pointers for the past 3 years and I've never
> made it work and I wasn't even trying to keep BC.
Many classes happily use d == nullptr for their partially formed, sometimes
even for their default-constructed state (QTimeZone, e.g.), even though
drawing the line is hard in Qt classes, due to lack of documentation on the
issue. QTimeZone checks d for nullptr in every member function, making it a
valid state (as opposed to a partially-formed one).
But I was more thinking about shared_empty, though that looks to be
complicated. At least the way QRegion does is is flawed (it uses double
indirection, and *still* creates a QVector<> in a dynamically-initialised
static-duration object. I wonder why Sérgio hasn't found that one yet...).
I experimented with QDateTimePrivate, which is simpler, but has a QTimeZone
member. Replacing that one with QTimeZonePrivate*, QSD inheritance with
QtP::RC aggregation and managing the QTZPrivate* ref-count manually should
work, though I stopped to watch GER-FRA and USA-PRC yesterday before coming
anywhere near completion. So probably too much work for all but the most
central classes.
These pimpls start to create a lot of additional work. One more reason to
reduce their use in value classes in the future, and esp. come Qt 6.
[...]
Thanks,
Marc
--
Marc Mutz <marc.mutz at kdab.com> | Senior Software Engineer
KDAB (Deutschland) GmbH & Co.KG, a KDAB Group Company
Tel: +49-30-521325470
KDAB - The Qt Experts
More information about the Development
mailing list