5#include <QtCore/qstring.h>
7#ifndef QSTRINGBUILDER_H
8#define QSTRINGBUILDER_H
13#pragma qt_class(QStringBuilder)
14#pragma qt_sync_stop_processing
17#include <QtCore/qbytearray.h>
27 static void convertFromUtf8(QByteArrayView in, QChar *&out)
noexcept;
28 static inline void convertFromAscii(
char a, QChar *&out)
noexcept
30 *out++ = QLatin1Char(a);
32 static void appendLatin1To(QLatin1StringView in, QChar *out)
noexcept;
38using QConcatenableEx = QConcatenable<q20::remove_cvref_t<T>>;
46 template <
typename T>
using HasIsNull =
decltype(
std::declval<
const T &>().isNull());
47 template <
typename T>
bool isNull(
const T &t)
49 if constexpr (qxp::is_detected_v<HasIsNull, T>)
56template<
typename Builder,
typename T>
63 T
resolved()
const {
return *
static_cast<
const Builder*>(
this); }
66template<
typename Builder,
typename T>
71template<
typename Builder>
72struct QStringBuilderBase<Builder, QString> :
public QStringBuilderCommon<Builder, QString>
74 QByteArray toLatin1()
const {
return this->resolved().toLatin1(); }
75 QByteArray toUtf8()
const {
return this->resolved().toUtf8(); }
76 QByteArray toLocal8Bit()
const {
return this->resolved().toLocal8Bit(); }
79template <
typename A,
typename B>
97 template <
typename T> T convertTo()
const
104 return convertToImpl<T>(Concatenable::size(*
this));
106 template <
typename T> T convertToImpl(
const qsizetype len)
const
108 T s(len, Qt::Uninitialized);
114 auto d =
reinterpret_cast<
typename T::iterator>(s.data_ptr().data());
115 const auto start = d;
116 Concatenable::appendTo(*
this, d);
118 if constexpr (Concatenable::ExactSize) {
121 if (len != d - start) {
156#ifndef QT_NO_CAST_FROM_ASCII
159 QAbstractConcatenable::convertFromAscii(c, out);
162 static inline void appendTo(
const char c,
char *&out)
166template <>
struct QConcatenable<QByteArrayView> :
private QAbstractConcatenable
168 typedef QByteArrayView type;
169 typedef QByteArray ConvertTo;
170 enum { ExactSize =
true };
171 static qsizetype size(QByteArrayView bav) {
return bav.size(); }
172#ifndef QT_NO_CAST_FROM_ASCII
173 QT_ASCII_CAST_WARN
static inline void appendTo(QByteArrayView bav, QChar *&out)
175 QAbstractConcatenable::convertFromUtf8(bav, out);
178 static inline void appendTo(QByteArrayView bav,
char *&out)
180 qsizetype n = bav.size();
182 memcpy(out, bav.data(), n);
193 static inline void appendTo(
char16_t c, QChar *&out)
197template <>
struct QConcatenable<QLatin1Char>
199 typedef QLatin1Char type;
200 typedef QString ConvertTo;
201 enum { ExactSize =
true };
202 static qsizetype size(
const QLatin1Char) {
return 1; }
203 static inline void appendTo(
const QLatin1Char c, QChar *&out)
205 static inline void appendTo(
const QLatin1Char c,
char *&out)
206 { *out++ = c.toLatin1(); }
209template <>
struct QConcatenable<QChar> :
private QAbstractConcatenable
212 typedef QString ConvertTo;
213 enum { ExactSize =
true };
214 static qsizetype size(
const QChar) {
return 1; }
215 static inline void appendTo(
const QChar c, QChar *&out)
219template <>
struct QConcatenable<QChar::SpecialCharacter> :
private QAbstractConcatenable
221 typedef QChar::SpecialCharacter type;
222 typedef QString ConvertTo;
223 enum { ExactSize =
true };
224 static qsizetype size(
const QChar::SpecialCharacter) {
return 1; }
225 static inline void appendTo(
const QChar::SpecialCharacter c, QChar *&out)
229template <>
struct QConcatenable<QLatin1StringView> :
private QAbstractConcatenable
231 typedef QLatin1StringView type;
232 typedef QString ConvertTo;
233 enum { ExactSize =
true };
234 static qsizetype size(
const QLatin1StringView a) {
return a.size(); }
235 static inline void appendTo(
const QLatin1StringView a, QChar *&out)
237 appendLatin1To(a, out);
240 static inline void appendTo(
const QLatin1StringView a,
char *&out)
242 if (
const char *data = a.data()) {
243 memcpy(out, data, a.size());
249template <>
struct QConcatenable<QString> :
private QAbstractConcatenable
251 typedef QString type;
252 typedef QString ConvertTo;
253 enum { ExactSize =
true };
254 static qsizetype size(
const QString &a) {
return a.size(); }
255 static inline void appendTo(
const QString &a, QChar *&out)
257 const qsizetype n = a.size();
259 memcpy(out, a.data(),
sizeof(QChar) * n);
264template <>
struct QConcatenable<QStringView> :
private QAbstractConcatenable
266 typedef QStringView type;
267 typedef QString ConvertTo;
268 enum { ExactSize =
true };
269 static qsizetype size(QStringView a) {
return a.size(); }
270 static inline void appendTo(QStringView a, QChar *&out)
272 const auto n = a.size();
274 memcpy(out, a.data(),
sizeof(QChar) * n);
285#ifndef QT_NO_CAST_FROM_ASCII
288 QAbstractConcatenable::convertFromUtf8(QByteArrayView(a, N - 1), out);
291 static inline void appendTo(
const char a[N],
char *&out)
309#ifndef QT_NO_CAST_FROM_ASCII
311 { QAbstractConcatenable::convertFromUtf8(QByteArrayView(a), out); }
313 static inline void appendTo(
const char *a,
char *&out)
329 using type =
const char16_t[N];
333 static void appendTo(
const char16_t a[N], QChar *&out)
335 memcpy(
static_cast<
void *>(out), a, (N - 1) *
sizeof(
char16_t));
365template <>
struct QConcatenable<QByteArray> :
private QAbstractConcatenable
367 typedef QByteArray type;
368 typedef QByteArray ConvertTo;
369 enum { ExactSize =
false };
370 static qsizetype size(
const QByteArray &ba) {
return ba.size(); }
371#ifndef QT_NO_CAST_FROM_ASCII
372 QT_ASCII_CAST_WARN
static inline void appendTo(
const QByteArray &ba, QChar *&out)
374 QAbstractConcatenable::convertFromUtf8(ba, out);
377 static inline void appendTo(
const QByteArray &ba,
char *&out)
379 const qsizetype n = ba.size();
381 memcpy(out, ba.begin(), n);
387template <
typename A,
typename B>
391 using ConvertTo =
typename QtStringBuilder::ConvertToTypeHelper<
392 typename QConcatenableEx<A>::ConvertTo,
393 typename QConcatenableEx<B>::ConvertTo
395 enum { ExactSize = QConcatenableEx<A>::ExactSize && QConcatenableEx<B>::ExactSize };
396 static qsizetype size(
const type &p)
398 return QConcatenableEx<A>::size(p.a) + QConcatenableEx<B>::size(p.b);
400 template<
typename T>
static inline void appendTo(
const type &p, T *&out)
402 QConcatenableEx<A>::appendTo(p.a, out);
403 QConcatenableEx<B>::appendTo(p.b, out);
407template <
typename A,
typename B,
408 typename = std::void_t<
typename QConcatenableEx<A>::type,
typename QConcatenableEx<B>::type>>
409auto operator%(A &&a, B &&b)
411 return QStringBuilder<A, B>(std::forward<A>(a), std::forward<B>(b));
416#if defined(QT_USE_FAST_OPERATOR_PLUS) || defined(QT_USE_QSTRINGBUILDER)
417template <
typename A,
typename B,
418 typename = std::void_t<
typename QConcatenableEx<A>::type,
typename QConcatenableEx<B>::type>>
419auto operator+(A &&a, B &&b)
421 return std::forward<A>(a) % std::forward<B>(b);
426template <
typename A,
typename B>
432 if (len > a.data_ptr().freeSpaceAtEnd())
433 a.reserve(qMax(len, 2 * a.capacity()));
434 char *it = a.data() + a.size();
440#ifndef QT_NO_CAST_TO_ASCII
441template <
typename A,
typename B>
444 return a += QString(b).toUtf8();
449template <
typename A,
typename B>
456template <
typename A,
typename B>
461 if (len > a.data_ptr().freeSpaceAtEnd())
462 a.reserve(qMax(len, 2 * a.capacity()));
463 QChar *it = a.data() + a.size();
466 a.resize(it - a.constData());
~QAbstractFileEngineHandlerList()
\inmodule QtCore\reentrant
QDateTime birthTime(const QTimeZone &tz) const
QDateTime metadataChangeTime(const QTimeZone &tz) const
Q_CORE_EXPORT bool isReadable() const
Q_CORE_EXPORT bool isHidden() const
Q_CORE_EXPORT bool isWritable() const
Q_CORE_EXPORT bool isExecutable() const
Q_CORE_EXPORT bool isFile() const
Q_CORE_EXPORT bool exists() const
Q_CORE_EXPORT bool isSymLink() const
Q_CORE_EXPORT bool isDir() const
QDateTime lastRead(const QTimeZone &tz) const
See the QFileInfo methods with the same names.
QDateTime lastModified(const QTimeZone &tz) const
const_iterator(const_iterator &&) noexcept=default
reference operator*() const
Returns a {const QDirListing::DirEntry &} of the directory entry this iterator points to.
const value_type * pointer
std::input_iterator_tag iterator_category
const value_type & reference
friend bool operator==(sentinel, const const_iterator &rhs) noexcept
const_iterator & operator=(const_iterator &&) noexcept=default
pointer operator->() const
Returns a {const QDirListing::DirEntry *} to the directory entry this iterator points to.
friend bool operator!=(sentinel, const const_iterator &rhs) noexcept
friend bool operator!=(const const_iterator &lhs, sentinel) noexcept
const_iterator & operator++()
Pre-increment operator.
friend bool operator==(const const_iterator &lhs, sentinel) noexcept
\typealias QDirListing::const_iterator::reference
friend constexpr bool operator==(sentinel, sentinel) noexcept
friend constexpr bool operator!=(sentinel, sentinel) noexcept
IteratorFlag
This enum class describes flags that can be used to configure the behavior of QDirListing.
const_iterator cbegin() const
QDirListing(QDirListing &&other) noexcept
const_iterator constBegin() const
sentinel constEnd() const
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
QStringBuilder(A &&a_, B &&b_)
operator ConvertTo() const
QStringBuilder(QStringBuilder &&)=default
QStringBuilder(const QStringBuilder &)=default
~QStringBuilder()=default
Concatenable::ConvertTo ConvertTo
Emulated const pointer to QVariant based on a pointer.
QVariantPointer is a template class that emulates a pointer to QVariant based on a pointer.
QVariantPointer(const Pointer *pointer)
Constructs a QVariantPointer from the given pointer.
QVariantRef< Pointer > operator*() const
Dereferences the QVariantPointer to a QVariantRef.
Pointer operator->() const
Dereferences and returns the pointer.
The QVariantRef acts as a non-const reference to a QVariant.
operator QVariant() const
Resolves the QVariantRef to an actual QVariant.
QVariantRef & operator=(const QVariantRef &value)
Assigns a new value to the value pointed to by the pointer this QVariantRef refers to.
QVariantRef & operator=(const QVariant &value)
Assigns a new value to the value pointed to by the pointer this QVariantRef refers to.
QVariantRef(const QVariantRef &)=default
QVariantRef(QVariantRef &&)=default
friend void swap(QVariantRef a, QVariantRef b)
QVariantRef & operator=(QVariantRef &&value)
Assigns a new value to the value pointed to by the pointer this QVariantRef refers to.
QVariantRef(const Pointer *reference)
Creates a QVariantRef from an pointer.
T qvariant_cast_qmetatype_converted(const QVariant &v, QMetaType targetType)
decltype(std::declval< const T & >().isNull()) HasIsNull
QByteArray & appendToByteArray(QByteArray &a, const QStringBuilder< A, B > &b, QChar)
QByteArray & appendToByteArray(QByteArray &a, const QStringBuilder< A, B > &b, char)
static QString appendSlashIfNeeded(const QString &path)
Q_CORE_EXPORT QDebug operator<<(QDebug debug, QDir::Filters filters)
QByteArray & operator+=(QByteArray &a, const QStringBuilder< A, B > &b)
T qvariant_cast(QVariant &&v)
T qvariant_cast(const QVariant &)
void swap(QVariant &value1, QVariant &value2) noexcept
static void appendTo(char16_t c, QChar *&out)
static constexpr qsizetype size(char16_t)
static QT_ASCII_CAST_WARN void appendTo(const char c, QChar *&out)
static qsizetype size(const char)
static void appendTo(const char c, char *&out)
static QT_ASCII_CAST_WARN void appendTo(const char16_t *a, QChar *&out)
static qsizetype size(const char16_t *a)
static qsizetype size(const char16_t[N])
static void appendTo(const char16_t a[N], QChar *&out)
static QT_ASCII_CAST_WARN void appendTo(const char *a, QChar *&out)
static void appendTo(const char *a, char *&out)
static qsizetype size(const char *a)
static void appendTo(const char a[N], char *&out)
static qsizetype size(const char[N])
static QT_ASCII_CAST_WARN void appendTo(const char a[N], QChar *&out)