On Tuesday 19 January 2016 18:34:48 Thiago Macieira wrote: > On Tuesday 19 January 2016 19:16:25 Marc Mutz wrote: > > That may be so. But most of what is _missing_ is implementable in Qt 5: > > > > - equal_range on hashed containers > > No idea what that is.
http://en.cppreference.com/w/cpp/container/unordered_map/equal_range It's the correct way to find all values matching a given key (as opposed to QHash::values(const Key &), which forces a QList down your throat). > > - range inserts, ctors, assignments > > Already done for QVector for Qt6. However, since I wrote this on top of > QGenericArray, I can't push it to Qt 5. I don't understand this. It can clearly be implemented in Qt 5, so what you're saying is that you implemented it in a Qt 5-incompatible fashion and _won't_ (as opposed to "can't") backport? > > - exception safety guarantees > > Done since Qt 5.0 by João, but missed the release deadline. It's > QGenericArray using QArrayDataPointer and QArrayDataOps. > > Also, we changed our policy towards exception-safety since 5.0 and this > work is no longer needed. Sending your user's needs to /dev/null is a very easy way to fix it, yes. This is what I meant and what Lars called me polemic for. *Qt* doesn't need this → we don't care. But please, everyone, use our super-cool containers and not the shitty STL ones, because we use camelCase and they use underhanded_names. Argh... BTW: here and in the following, I'm not saying *you* should implement all this. I'm just picking on you because a) I know you can take it and b) it exemplifies very well what started this thread (back when this was still about std::optional and why QOptional would be a bad idea). > > - move semantics on realloc / insertions > > This is easy to implement in QArrayDataOps. However, due to CoW, we'd have > to duplicate the code paths depending on whether the refcount was 1 or > not. That's a runtime decision, so I don't think this is worth it. Oh, CoW again... Howard Hinnant has reported a 10x (or was it 100x?) slowdown on std::vector<std::string> reallocation, depending on whether the std::string move ctor was marked as noexcept (std::vector refuses to move during reallocations when the type isn't nothrow_move_constructible). So, very much worth it, I think. > > - emplace (with Q_COMPILER_UNIFORM_INIT ifdef) > > Done in QGenericArray, but not really relevant since we don't support move- > only types. emplace is not about move-only types. move-only types can be appended with push_back(T&&). emplace is about constructing into the final place. Without any move or copy ctor called. As Alexandrescu put it: no work is less work than some work. > > - not requiring op= / default ctor in QVector > > Not interesting to me. That wouldn't be a problem if it would be interesting to *anyone*. Again, development stopped half-way. And this is a very annoying one. When porting from QList (which doesn't require default ctors), you end up adding an artificial default ctor to the payload type, which, surprisingly often, doesn't have one. Well, or you skip QVector and go directly to std::vector and save that nonsense. > > - move-only payload types (hard with CoW) > > Ditto. Which means QVector will not be able to hold unique_ptrs or std::threads. Well done. > > - splicing in node-based containers (hard with CoW) > > Ditto and no one has asked this in 10 years that QLinkedList has existed. Because no-one uses that container. In 100% of cases _I_ used std::list, it was because it had splice(): nothrow move from one std::list to the next in C++98: https://code.woboq.org/kde/kdepim/kleopatra/smartcard/readerstatus.cpp.html#509 peeling off one object from a std::list without so much as resetting four pointers: https://code.woboq.org/kde/kdepim/kleopatra/smartcard/readerstatus.cpp.html#554 I later learned that Herb Sutter calls this idiom an "acceptable poor man's concurrent queue". And again: *Qt* doesn't need this → we don't care. > > - atomic operations on QSharedPointer > > Explain more, please. You can CAS on a shared_ptr instance, as if it was a normal pointer: http://en.cppreference.com/w/cpp/memory/shared_ptr/atomic > > - alias ctors for QSharedPointer > > Ditto. http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr ctor #8 > > - changing iterator → const_iterator in insert / erase argumentsis > > > > (hampered by QT_STRICT_ITERATORS preventing iterator → const_iterator > > implicit conversions, otherwise one could write erase loops over > > > > node-based containers that only detach when actually removing an element) > > Sounds like a Qt 6 change. Adding overloads is possible. Thanks, Marc -- Marc Mutz <marc.m...@kdab.com> | Senior Software Engineer KDAB (Deutschland) GmbH & Co.KG, a KDAB Group Company Tel: +49-30-521325470 KDAB - The Qt Experts _______________________________________________ Development mailing list Development@qt-project.org http://lists.qt-project.org/mailman/listinfo/development