[Development] QtCS 2017 QtCore sessions
Thiago Macieira
thiago.macieira at intel.com
Tue Oct 10 14:49:48 CEST 2017
[we combined the main and containers session; we did not have time for
QIODevice]
== Intro ==
Suggested topics:
* QIODevice for Qt 6
* adding std::hash for Qt types
* expanding the hash seed to 64- or 128-bit
Move to the containers session:
* use qssize_t
Quick conclusions:
* QRandomGenerator and providing a PRNG of good quality (Mersenne Twister or
Chacha20)
** Yes if our compilers support
* hashing function update:
** Use SipHash-1-2, benchmark 32-bit SipHash
** See if Allan is interested in implementing with ARM AES
== Use of standard C++ API ==
We will not add compilers that are worse than what we have today.
* If all the compilers we have support things like std::mersenne_twister, then
all will
* We can add hard-fail configure test
* Should we start migrating from QSharedPointer to std::shared_ptr?
** Deprecate
** Deprecate QScopedPointer
* What about API from C++17/20 that we'd like to use?
** Try to backport the API into a QtPrivate namespace (if it's been
standardised) unless we want to add significant functionality a la QStringView
** If it's not standardised yet, use Qt-style naming
* API naming
** std:: API naming is subtly different from Qt API (hopefully nothing that is
confusing or misleading)
** We could try to create wrappers (container.empty() → container.isEmpty())
== Modifiers vs getters for QString/QStringView/QByteArray ==
We don't want people to write:
str = std::move(str).simplified()
We want instead:
str.simplify()
So we want to add the full set of modifiers.
Do we want to add freestanding functions that may operate on std::string and
other string types?
* Like qSimplify()
* Polluting namespace
* They'd all need to be inline and some could be big
* freestanding brings in ADL and could introduce unexpected isues
* We think members are cleaner and we don't want to add these
* However, we already have some of those! qStartsWith
** Global namespace *and* documented
** foo.startsWith(bar) vs qStartsWith(foo, bar)
** Same conclusion, probably mark \internal, namespace them
*** But review the changes to see what our arguments were on making them
public
== QStringView ==
* NEVER return QStringView (but QRegularExpression wants to)
** Consequence of "never return a reference" (but containers do)
** Lifetime issues
auto s = lineedit.text().left(n);
s valid?
* We can be flexible on having exceptions:
** The API needs to be specifically designed for dealing with references
** Clear naming, such as QRegularExpression::captureView()
Discussion not finished
== Containers ==
You cannot have all three:
# Implicit sharing
# Performance
# Data-compatibility with std:: containers
QList:
* [https://codereview.qt-project.org/194984 QUIP 9]
Conclusions:
* If we have QStringView, QArrayView, QByteArrayView, we don't need
fromRawData()
* We use qssize_t everywhere
** Check if we want to rename it to "qssize" (bikeshed warning!) : https://
codereview.qt-project.org/#/c/208050/
* Investigate C++ contract assertions
Containers relevant:
* QArrayData-based containers: QString, QByteArray, QVector
** Backed by the same template implementation (QArrayDataPointer)
** They grow to 3*sizeof(void*): {d pointer, begin pointer, qssize_t };
** Implementations:
template<typename T> using QVector = QVectorImplementation<T, RefCounted>;
template<typename T> using QExclusiveVector = QVectorImplementation<T,
NotRefCounted>;
QExclusiveVector v;
v.resize(1024);
auto ptr = v.data();
// instead of: auto ptr = const_cast<QChar *>(v.constData())
QVector v2 = std::move(v);
v = std::move(v2);
* QStringView
* QHash, QMap
** Wrapping std::{unordered_}map may be acceptable
** Would we want to use qHash as the HashFunction with std::unordered_map?
--
Thiago Macieira - thiago.macieira (AT) intel.com
Software Architect - Intel Open Source Technology Center
More information about the Development
mailing list