QByteArray: update documentation

The QByteArray documentation is extended to align with QList and
QString regarding common wording and ideas:
- Extend general class description
- Revise description of several methods
- Wrap descriptions at 80 characters

Task-number: QTBUG-87962
Change-Id: Ie9e8ef47a85d0867c2fa63889a60cafbe76ee47a
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
(cherry picked from commit 2eb7d6073d5132a8bf269f5c6fc9f89fde446ab5)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Ivan Solovev 2020-11-30 16:03:21 +01:00 committed by Qt Cherry-pick Bot
parent 622efb8ecc
commit ca389cdecf
2 changed files with 147 additions and 82 deletions

View File

@ -503,17 +503,4 @@ qDebug(ba.constData());
//! [53] //! [53]
QByteArray ba = QByteArrayLiteral("byte array contents"); QByteArray ba = QByteArrayLiteral("byte array contents");
//! [53] //! [53]
//! [54]
QByteArray ba("abc");
const char big[10] = "abc";
ba.compare(big); // returns -1, big is longer than ba
// In contrast:
const char arr[] = "abc";
ba.compare(arr); // returns 0, both have the same size and data
const char *str = "abc";
ba.compare(str); // returns 0, the size is determined by scanning for '\0'
//! [54]
} }

View File

@ -212,7 +212,8 @@ char *qstrncpy(char *dst, const char *src, size_t len)
\nullptr, it is treated as less than the other (even if the other is an \nullptr, it is treated as less than the other (even if the other is an
empty string). empty string).
\sa qstrncmp(), qstricmp(), qstrnicmp(), {Character Case}, QByteArray::compare() \sa qstrncmp(), qstricmp(), qstrnicmp(), {Character Case},
QByteArray::compare()
*/ */
int qstrcmp(const char *str1, const char *str2) int qstrcmp(const char *str1, const char *str2)
{ {
@ -236,7 +237,8 @@ int qstrcmp(const char *str1, const char *str2)
\nullptr, it is treated as less than the other (even if the other is an \nullptr, it is treated as less than the other (even if the other is an
empty string or \a len is 0). empty string or \a len is 0).
\sa qstrcmp(), qstricmp(), qstrnicmp(), {Character Case}, QByteArray::compare() \sa qstrcmp(), qstricmp(), qstrnicmp(), {Character Case},
QByteArray::compare()
*/ */
/*! \relates QByteArray /*! \relates QByteArray
@ -254,7 +256,8 @@ int qstrcmp(const char *str1, const char *str2)
\nullptr, it is treated as less than the other (even if the other is an \nullptr, it is treated as less than the other (even if the other is an
empty string). empty string).
\sa qstrcmp(), qstrncmp(), qstrnicmp(), {Character Case}, QByteArray::compare() \sa qstrcmp(), qstrncmp(), qstrnicmp(), {Character Case},
QByteArray::compare()
*/ */
int qstricmp(const char *str1, const char *str2) int qstricmp(const char *str1, const char *str2)
@ -343,7 +346,8 @@ int qstricmp(const char *str1, const char *str2)
\nullptr, it is treated as less than the other (even if the other is an \nullptr, it is treated as less than the other (even if the other is an
empty string or \a len is 0). empty string or \a len is 0).
\sa qstrcmp(), qstrncmp(), qstricmp(), {Character Case}, QByteArray::compare() \sa qstrcmp(), qstrncmp(), qstricmp(), {Character Case},
QByteArray::compare()
*/ */
int qstrnicmp(const char *str1, const char *str2, size_t len) int qstrnicmp(const char *str1, const char *str2, size_t len)
@ -772,16 +776,48 @@ QByteArray qUncompress(const uchar* data, qsizetype nbytes)
\snippet code/src_corelib_text_qbytearray.cpp 3 \snippet code/src_corelib_text_qbytearray.cpp 3
The replace() and remove() functions' first two arguments are the In the above example the replace() function's first two arguments are the
position from which to start erasing and the number of bytes that position from which to start replacing and the number of bytes that
should be erased. should be replaced.
When you append() data to a non-empty array, the array will be When data-modifying functions increase the size of the array,
reallocated and the new data copied to it. You can avoid this they may lead to reallocation of memory for the QByteArray object. When
behavior by calling reserve(), which preallocates a certain amount this happens, QByteArray expands by more than it immediately needs so as
to have space for further expansion without reallocation until the size
of the array has greatly increased.
The insert(), remove() and, when replacing a sub-array with one of
different size, replace() functions can be slow (\l{linear time}) for
large arrays, because they require moving many bytes in the array by
at least one position in memory.
If you are building a QByteArray gradually and know in advance
approximately how many bytes the QByteArray will contain, you
can call reserve(), asking QByteArray to preallocate a certain amount
of memory. You can also call capacity() to find out how much of memory. You can also call capacity() to find out how much
memory QByteArray actually allocated. Data appended to an empty memory the QByteArray actually has allocated.
array is not copied.
Note that using non-const operators and functions can cause
QByteArray to do a deep copy of the data, due to \l{implicit sharing}.
QByteArray provides \l{STL-style iterators} (QByteArray::const_iterator and
QByteArray::iterator). In practice, iterators are handy when working with
generic algorithms provided by the C++ standard library.
\note Iterators and references to individual QByteArray elements are subject
to stability issues. They are often invalidated when a QByteArray-modifying
operation (e.g. insert() or remove()) is called. When stability and
iterator-like functionality is required, you should use indexes instead of
iterators as they are not tied to QByteArray's internal state and thus do
not get invalidated.
\note Iterators over a QByteArray, and references to individual bytes
within one, cannot be relied on to remain valid when any non-const method
of the QByteArray is called. Accessing such an iterator or reference after
the call to a non-const method leads to undefined behavior. When stability
for iterator-like functionality is required, you should use indexes instead
of iterators as they are not tied to QByteArray's internal state and thus do
not get invalidated.
If you want to find all occurrences of a particular byte or sequence of If you want to find all occurrences of a particular byte or sequence of
bytes in a QByteArray, use indexOf() or lastIndexOf(). The former searches bytes in a QByteArray, use indexOf() or lastIndexOf(). The former searches
@ -823,9 +859,19 @@ QByteArray qUncompress(const uchar* data, qsizetype nbytes)
\section1 Maximum size and out-of-memory conditions \section1 Maximum size and out-of-memory conditions
In case memory allocation fails, QByteArray will throw a \c std::bad_alloc The maximum size of QByteArray depends on the architecture. Most 64-bit
exception. Out of memory conditions in the Qt containers are the only case systems can allocate more than 2 GB of memory, with a typical limit
where Qt will throw exceptions. of 2^63 bytes. The actual value also depends on the overhead required for
managing the data block. As a result, you can expect the maximum size
of 2 GB minus overhead on 32-bit platforms, and 2^63 bytes minus overhead
on 64-bit platforms. The number of elements that can be stored in a
QByteArray is this maximum size.
When memory allocation fails, QByteArray throws a \c std::bad_alloc
exception if the application is being compiled with exception support.
Out of memory conditions in Qt containers are the only case where Qt
will throw exceptions. If exceptions are disabled, then running out of
memory is undefined behavior.
Note that the operating system may impose further limits on applications Note that the operating system may impose further limits on applications
holding a lot of allocated memory, especially large, contiguous blocks. holding a lot of allocated memory, especially large, contiguous blocks.
@ -848,14 +894,6 @@ QByteArray qUncompress(const uchar* data, qsizetype nbytes)
such a pointer, without a length, will interpret it as this sequence of such a pointer, without a length, will interpret it as this sequence of
bytes. Such a sequence, by construction, cannot contain a '\\0' byte. bytes. Such a sequence, by construction, cannot contain a '\\0' byte.
Take care when passing fixed size C arrays to QByteArray methods that accept
a QByteArrayView: the length of the data on which the method will operate is
determined by array size. A \c{char [N]} array will be handled as a view of
size \c{N-1}, on the expectation that the array is a string literal with a '\\0'
at index \c{N-1}. For example:
\snippet code/src_corelib_text_qbytearray.cpp 54
Other overloads accept a start-pointer and a byte-count; these use the given Other overloads accept a start-pointer and a byte-count; these use the given
number of bytes, following the start address, regardless of whether any of number of bytes, following the start address, regardless of whether any of
them happen to be '\\0' bytes. In some cases, where there is no overload them happen to be '\\0' bytes. In some cases, where there is no overload
@ -1003,8 +1041,8 @@ QByteArray qUncompress(const uchar* data, qsizetype nbytes)
/*! \fn QByteArray::reverse_iterator QByteArray::rbegin() /*! \fn QByteArray::reverse_iterator QByteArray::rbegin()
\since 5.6 \since 5.6
Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to the first Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to
byte in the byte-array, in reverse order. the first byte in the byte-array, in reverse order.
\include qbytearray.cpp iterator-invalidation-func-desc \include qbytearray.cpp iterator-invalidation-func-desc
@ -1019,8 +1057,8 @@ QByteArray qUncompress(const uchar* data, qsizetype nbytes)
/*! \fn QByteArray::const_reverse_iterator QByteArray::crbegin() const /*! \fn QByteArray::const_reverse_iterator QByteArray::crbegin() const
\since 5.6 \since 5.6
Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to the first Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing
byte in the byte-array, in reverse order. to the first byte in the byte-array, in reverse order.
\include qbytearray.cpp iterator-invalidation-func-desc \include qbytearray.cpp iterator-invalidation-func-desc
@ -1030,8 +1068,8 @@ QByteArray qUncompress(const uchar* data, qsizetype nbytes)
/*! \fn QByteArray::reverse_iterator QByteArray::rend() /*! \fn QByteArray::reverse_iterator QByteArray::rend()
\since 5.6 \since 5.6
Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to one past Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing just
the last byte in the byte-array, in reverse order. after the last byte in the byte-array, in reverse order.
\include qbytearray.cpp iterator-invalidation-func-desc \include qbytearray.cpp iterator-invalidation-func-desc
@ -1046,8 +1084,8 @@ QByteArray qUncompress(const uchar* data, qsizetype nbytes)
/*! \fn QByteArray::const_reverse_iterator QByteArray::crend() const /*! \fn QByteArray::const_reverse_iterator QByteArray::crend() const
\since 5.6 \since 5.6
Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to one Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing
past the last byte in the byte-array, in reverse order. just after the last byte in the byte-array, in reverse order.
\include qbytearray.cpp iterator-invalidation-func-desc \include qbytearray.cpp iterator-invalidation-func-desc
@ -1248,16 +1286,27 @@ QByteArray &QByteArray::operator=(const char *str)
/*! \fn void QByteArray::reserve(qsizetype size) /*! \fn void QByteArray::reserve(qsizetype size)
Attempts to allocate memory for at least \a size bytes. If you Attempts to allocate memory for at least \a size bytes.
know in advance how large the byte array will be, you can call
If you know in advance how large the byte array will be, you can call
this function, and if you call resize() often you are likely to this function, and if you call resize() often you are likely to
get better performance. If \a size is an underestimate, the worst get better performance.
that will happen is that the QByteArray will be a bit slower.
If in doubt about how much space shall be needed, it is usually better to
use an upper bound as \a size, or a high estimate of the most likely size,
if a strict upper bound would be much bigger than this. If \a size is an
underestimate, the array will grow as needed once the reserved size is
exceeded, which may lead to a larger allocation than your best overestimate
would have and will slow the operation that triggers it.
\warning reserve() reserves memory but does not change the size of the byte
array. Accessing data beyond the end of the byte array is undefined
behavior. If you need to access memory beyond the current end of the array,
use resize().
The sole purpose of this function is to provide a means of fine The sole purpose of this function is to provide a means of fine
tuning QByteArray's memory usage. In general, you will rarely tuning QByteArray's memory usage. In general, you will rarely
ever need to call this function. If you want to change the size ever need to call this function.
of the byte array, call resize().
\sa squeeze(), capacity() \sa squeeze(), capacity()
*/ */
@ -1352,8 +1401,8 @@ QByteArray &QByteArray::operator=(const char *str)
/*! \fn const char *QByteArray::constData() const /*! \fn const char *QByteArray::constData() const
Returns a pointer to the data stored in the byte array. The pointer can be Returns a pointer to the const data stored in the byte array. The pointer
used to access the bytes that compose the array. The data is can be used to access the bytes that compose the array. The data is
'\\0'-terminated unless the QByteArray object was created from raw data. '\\0'-terminated unless the QByteArray object was created from raw data.
\include qbytearray.cpp pointer-invalidation-desc \include qbytearray.cpp pointer-invalidation-desc
@ -1665,10 +1714,13 @@ QByteArray::QByteArray(qsizetype size, Qt::Initialization)
extended to make it \a size bytes with the extra bytes added to extended to make it \a size bytes with the extra bytes added to
the end. The new bytes are uninitialized. the end. The new bytes are uninitialized.
If \a size is less than the current size, bytes are removed from If \a size is less than the current size, bytes beyond position
the end. \a size are excluded from the byte array.
\sa size(), truncate() \note While resize() will grow the capacity if needed, it never shrinks
capacity. To shed excess capacity, use squeeze().
\sa size(), truncate(), squeeze()
*/ */
void QByteArray::resize(qsizetype size) void QByteArray::resize(qsizetype size)
{ {
@ -1769,6 +1821,10 @@ QByteArray QByteArray::nulTerminated() const
Prepends the byte array view \a ba to this byte array and returns a Prepends the byte array view \a ba to this byte array and returns a
reference to this byte array. reference to this byte array.
This operation is typically very fast (\l{constant time}), because
QByteArray preallocates extra space at the beginning of the data,
so it can grow without reallocating the entire array each time.
Example: Example:
\snippet code/src_corelib_text_qbytearray.cpp 15 \snippet code/src_corelib_text_qbytearray.cpp 15
@ -1838,9 +1894,9 @@ QByteArray &QByteArray::prepend(const QByteArray &ba)
If the byte array being appended to is not empty, a deep copy of the If the byte array being appended to is not empty, a deep copy of the
data is performed, taking \l{linear time}. data is performed, taking \l{linear time}.
This operation typically does not suffer from allocation overhead, The append() function is typically very fast (\l{constant time}),
because QByteArray preallocates extra space at the end of the data because QByteArray preallocates extra space at the end of the data,
so that it may grow without reallocating for each append operation. so it can grow without reallocating the entire array each time.
\sa operator+=(), prepend(), insert() \sa operator+=(), prepend(), insert()
*/ */
@ -1916,6 +1972,16 @@ QByteArray& QByteArray::append(char ch)
\snippet code/src_corelib_text_qbytearray.cpp 17 \snippet code/src_corelib_text_qbytearray.cpp 17
\since 6.0 \since 6.0
For large byte arrays, this operation can be slow (\l{linear time}),
because it requires moving all the bytes at indexes \a i and
above by at least one position further in memory.
//! [array-grow-at-insertion]
This array grows to accommodate the insertion. If \a position is beyond
the end of the array, the array is first extended with space characters
to reach this \a position.
//! [array-grow-at-insertion]
\sa append(), prepend(), replace(), remove() \sa append(), prepend(), replace(), remove()
*/ */
QByteArray &QByteArray::insert(qsizetype i, QByteArrayView data) QByteArray &QByteArray::insert(qsizetype i, QByteArrayView data)
@ -1958,6 +2024,8 @@ QByteArray &QByteArray::insert(qsizetype i, QByteArrayView data)
Inserts \a data at index position \a i and returns a Inserts \a data at index position \a i and returns a
reference to this byte array. reference to this byte array.
\include qbytearray.cpp array-grow-at-insertion
\sa append(), prepend(), replace(), remove() \sa append(), prepend(), replace(), remove()
*/ */
@ -1966,6 +2034,8 @@ QByteArray &QByteArray::insert(qsizetype i, QByteArrayView data)
Inserts \a s at index position \a i and returns a Inserts \a s at index position \a i and returns a
reference to this byte array. reference to this byte array.
\include qbytearray.cpp array-grow-at-insertion
The function is equivalent to \c{insert(i, QByteArrayView(s))} The function is equivalent to \c{insert(i, QByteArrayView(s))}
\sa append(), prepend(), replace(), remove() \sa append(), prepend(), replace(), remove()
@ -1979,16 +2049,16 @@ QByteArray &QByteArray::insert(qsizetype i, QByteArrayView data)
Inserts \a len bytes, starting at \a data, at position \a i in the byte Inserts \a len bytes, starting at \a data, at position \a i in the byte
array. array.
If \a i is greater than size(), the array is first extended using \include qbytearray.cpp array-grow-at-insertion
resize().
*/ */
/*! /*!
\fn QByteArray &QByteArray::insert(qsizetype i, char ch) \fn QByteArray &QByteArray::insert(qsizetype i, char ch)
\overload \overload
Inserts byte \a ch at index position \a i in the byte array. If \a i is Inserts byte \a ch at index position \a i in the byte array.
greater than size(), the array is first extended using resize().
\include qbytearray.cpp array-grow-at-insertion
*/ */
/*! \fn QByteArray &QByteArray::insert(qsizetype i, qsizetype count, char ch) /*! \fn QByteArray &QByteArray::insert(qsizetype i, qsizetype count, char ch)
@ -1999,7 +2069,7 @@ QByteArray &QByteArray::insert(qsizetype i, QByteArrayView data)
Inserts \a count copies of byte \a ch at index position \a i in the byte Inserts \a count copies of byte \a ch at index position \a i in the byte
array. array.
If \a i is greater than size(), the array is first extended using resize(). \include qbytearray.cpp array-grow-at-insertion
*/ */
QByteArray &QByteArray::insert(qsizetype i, qsizetype count, char ch) QByteArray &QByteArray::insert(qsizetype i, qsizetype count, char ch)
@ -2036,7 +2106,11 @@ QByteArray &QByteArray::insert(qsizetype i, qsizetype count, char ch)
Example: Example:
\snippet code/src_corelib_text_qbytearray.cpp 18 \snippet code/src_corelib_text_qbytearray.cpp 18
\sa insert(), replace() Element removal will preserve the array's capacity and not reduce the
amount of allocated memory. To shed extra capacity and free as much memory
as possible, call squeeze() after the last change to the array's size.
\sa insert(), replace(), squeeze()
*/ */
QByteArray &QByteArray::remove(qsizetype pos, qsizetype len) QByteArray &QByteArray::remove(qsizetype pos, qsizetype len)
@ -2438,10 +2512,10 @@ qsizetype QtPrivate::lastIndexOf(QByteArrayView haystack, qsizetype from, QByteA
/*! \fn qsizetype QByteArray::lastIndexOf(QByteArrayView bv, qsizetype from) const /*! \fn qsizetype QByteArray::lastIndexOf(QByteArrayView bv, qsizetype from) const
\since 6.0 \since 6.0
Returns the index position of the start of the last occurrence of the sequence Returns the index position of the start of the last occurrence of the
of bytes viewed by \a bv in this byte array, searching backward from index sequence of bytes viewed by \a bv in this byte array, searching backward
position \a from. If \a from is -1 (the default), the search starts from the from index position \a from. If \a from is -1 (the default), the search
end of the byte array. Returns -1 if no match is found. starts from the end of the byte array. Returns -1 if no match is found.
Example: Example:
\snippet code/src_corelib_text_qbytearray.cpp 23 \snippet code/src_corelib_text_qbytearray.cpp 23
@ -2452,10 +2526,10 @@ qsizetype QtPrivate::lastIndexOf(QByteArrayView haystack, qsizetype from, QByteA
/*! /*!
\overload \overload
Returns the index position of the start of the last occurrence of byte \a ch in Returns the index position of the start of the last occurrence of byte \a ch
this byte array, searching backward from index position \a from. If \a from is -1 in this byte array, searching backward from index position \a from.
(the default), the search starts at the last byte (at index size() - 1). Returns If \a from is -1 (the default), the search starts at the last byte
-1 if no match is found. (at index size() - 1). Returns -1 if no match is found.
Example: Example:
\snippet code/src_corelib_text_qbytearray.cpp 24 \snippet code/src_corelib_text_qbytearray.cpp 24
@ -2531,8 +2605,8 @@ qsizetype QByteArray::count(char ch) const
Returns an integer less than, equal to, or greater than zero depending on Returns an integer less than, equal to, or greater than zero depending on
whether this QByteArray sorts before, at the same position as, or after the whether this QByteArray sorts before, at the same position as, or after the
QByteArrayView \a bv. The comparison is performed according to case sensitivity QByteArrayView \a bv. The comparison is performed according to case
\a cs. sensitivity \a cs.
\sa operator==, {Character Case} \sa operator==, {Character Case}
*/ */
@ -2795,7 +2869,7 @@ QByteArray QByteArray::mid(qsizetype pos, qsizetype len) const
*/ */
/*! /*!
\fn QByteArray::chopped(qsizetype len) const \fn QByteArray QByteArray::chopped(qsizetype len) const
\since 5.10 \since 5.10
Returns a byte array that contains the leftmost size() - \a len bytes of Returns a byte array that contains the leftmost size() - \a len bytes of
@ -4290,9 +4364,9 @@ QByteArray QByteArray::fromBase64(const QByteArray &base64, Base64Options option
} }
/*! /*!
Returns a decoded copy of the hex encoded array \a hexEncoded. Input is not checked Returns a decoded copy of the hex encoded array \a hexEncoded. Input is not
for validity; invalid characters in the input are skipped, enabling the checked for validity; invalid characters in the input are skipped, enabling
decoding process to continue with subsequent characters. the decoding process to continue with subsequent characters.
For example: For example:
@ -4325,10 +4399,13 @@ QByteArray QByteArray::fromHex(const QByteArray &hexEncoded)
return res; return res;
} }
/*! Returns a hex encoded copy of the byte array. The hex encoding uses the numbers 0-9 and /*!
the letters a-f. Returns a hex encoded copy of the byte array.
If \a separator is not '\0', the separator character is inserted between the hex bytes. The hex encoding uses the numbers 0-9 and the letters a-f.
If \a separator is not '\0', the separator character is inserted between
the hex bytes.
Example: Example:
\snippet code/src_corelib_text_qbytearray.cpp 50 \snippet code/src_corelib_text_qbytearray.cpp 50
@ -4721,7 +4798,8 @@ QByteArray QByteArray::toPercentEncoding(const QByteArray &exclude, const QByteA
/*! /*!
\fn bool QByteArray::FromBase64Result::operator!=(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept \fn bool QByteArray::FromBase64Result::operator!=(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
Returns \c true if \a lhs and \a rhs are different, otherwise returns \c false. Returns \c true if \a lhs and \a rhs are different, otherwise
returns \c false.
*/ */
/*! /*!