Revision control

++ // Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
++ // Qt-Security score:significant reason:docs
++
++ /*!
++ \class QUtf8StringView
++ \inmodule QtCore
++ \since 6.0
++ \brief The QUtf8StringView class provides a unified view on UTF-8 strings
++ with a read-only subset of the QString API.
++ \reentrant
++ \ingroup tools
++ \ingroup string-processing
++
++ \compares strong
++ \compareswith strong char16_t QChar {const char16_t *} QString QStringView \
++ QLatin1StringView
++ \endcompareswith
++ \compareswith strong {const char *} QByteArray QByteArrayView
++ The contents of byte arrays is interpreted as UTF-8.
++ \endcompareswith
++
++ A QUtf8StringView references a contiguous portion of a UTF-8
++ string it does not own. It acts as an interface type to all kinds
++ of UTF-8 string, without the need to construct a QString or
++ QByteArray first.
++
++ The UTF-8 string may be represented as an array (or an
++ array-compatible data-structure such as std::basic_string, etc.)
++ of \c char8_t, \c char, \c{signed char} or \c{unsigned char}.
++
++ QUtf8StringView is designed as an interface type; its main
++ use-case is as a function parameter type. When QUtf8StringViews
++ are used as automatic variables or data members, care must be
++ taken to ensure that the referenced string data (for example,
++ owned by a std::u8string) outlives the QUtf8StringView on all code
++ paths, lest the string view ends up referencing deleted data.
++
++ When used as an interface type, QUtf8StringView allows a single
++ function to accept a wide variety of UTF-8 string data
++ sources. One function accepting QUtf8StringView thus replaces
++ several function overloads (taking e.g. QByteArray), while at the
++ same time enabling even more string data sources to be passed to
++ the function, such as \c{u8"Hello World"}, a \c char8_t (C++20) or
++ \c char (C++17) string literal. The \c char8_t incompatibility
++ between C++17 and C++20 goes away when using QUtf8StringView.
++
++ Like all views, QUtf8StringViews should be passed by value, not by
++ reference-to-const:
++ \snippet code/src_corelib_text_qutf8stringview.cpp 0
++
++ If you want to give your users maximum freedom in what strings
++ they can pass to your function, consider using QAnyStringView
++ instead.
++
++ QUtf8StringView can also be used as the return value of a
++ function. If you call a function returning QUtf8StringView, take
++ extra care to not keep the QUtf8StringView around longer than the
++ function promises to keep the referenced string data alive. If in
++ doubt, obtain a strong reference to the data by calling toString()
++ to convert the QUtf8StringView into a QString.
++
++ QUtf8StringView is a \e{Literal Type}.
++
++ \section2 Compatible Character Types
++
++ QUtf8StringView accepts strings over a variety of character types:
++
++ \list
++ \li \c char (both signed and unsigned)
++ \li \c char8_t (C++20 only)
++ \endlist
++
++ \section2 Sizes and Sub-Strings
++
++ All sizes and positions in QUtf8StringView functions are in
++ UTF-8 code points (that is, UTF-8 multibyte sequences count as
++ two, three or four, depending on their length). QUtf8StringView
++ does not an attempt to detect or prevent slicing right through
++ UTF-8 multibyte sequences. This is similar to the situation with
++ QStringView and surrogate pairs.
++
++ \section2 C++20, char8_t, and QUtf8StringView
++
++ In C++20, \c{u8""} string literals changed their type from
++ \c{const char[]} to \c{const char8_t[]}. If Qt 6 could have depended
++ on C++20, QUtf8StringView would store \c char8_t natively, and the
++ following functions and aliases would use (pointers to) \c char8_t:
++
++ \list
++ \li storage_type, value_type, etc
++ \li begin(), end(), data(), etc
++ \li front(), back(), at(), operator[]()
++ \endlist
++
++ This is what QUtf8StringView is expected to look like in Qt 7, but for
++ Qt 6, this was not possible. Instead of locking users into a C++17-era
++ interface for the next decade, Qt provides two QUtf8StringView classes,
++ in different (inline) namespaces. The first, in namespace \c{q_no_char8_t},
++ has a value_type of \c{const char} and is universally available.
++ The second, in namespace \c{q_has_char8_t}, has a value_type of
++ \c{const char8_t} and is only available when compiling in C++20 mode.
++
++ \c{q_no_char8_t} is an inline namespace regardless of C++ edition, to avoid
++ accidental binary incompatibilities. To use the \c{char8_t} version, you
++ need to name it explicitly with \c{q_has_char8_t::QUtf8StringView}.
++
++ Internally, both are instantiations of the same template class,
++ QBasicUtf8StringView. Please do not use the template class's name in your
++ source code.
++
++ \sa QAnyStringView, QStringView, QLatin1StringView, QString
++ */
++
++ /*!
++ \typedef QUtf8StringView::storage_type
++
++ Alias for \c{char}.
++ */
++
++ /*!
++ \typedef QUtf8StringView::value_type
++
++ Alias for \c{const char}. Provided for compatibility with the STL.
++ */
++
++ /*!
++ \typedef QUtf8StringView::difference_type
++
++ Alias for \c{std::ptrdiff_t}. Provided for compatibility with the STL.
++ */
++
++ /*!
++ \typedef QUtf8StringView::size_type
++
++ Alias for qsizetype. Provided for compatibility with the STL.
++ */
++
++ /*!
++ \typedef QUtf8StringView::reference
++
++ Alias for \c{value_type &}. Provided for compatibility with the STL.
++
++ QUtf8StringView does not support mutable references, so this is the same
++ as const_reference.
++ */
++
++ /*!
++ \typedef QUtf8StringView::const_reference
++
++ Alias for \c{value_type &}. Provided for compatibility with the STL.
++ */
++
++ /*!
++ \typedef QUtf8StringView::pointer
++
++ Alias for \c{value_type *}. Provided for compatibility with the STL.
++
++ QUtf8StringView does not support mutable pointers, so this is the same
++ as const_pointer.
++ */
++
++ /*!
++ \typedef QUtf8StringView::const_pointer
++
++ Alias for \c{value_type *}. Provided for compatibility with the STL.
++ */
++
++ /*!
++ \typedef QUtf8StringView::iterator
++
++ This typedef provides an STL-style const iterator for QUtf8StringView.
++
++ QUtf8StringView does not support mutable iterators, so this is the same
++ as const_iterator.
++
++ \sa const_iterator, reverse_iterator
++ */
++
++ /*!
++ \typedef QUtf8StringView::const_iterator
++
++ This typedef provides an STL-style const iterator for QUtf8StringView.
++
++ \sa iterator, const_reverse_iterator
++ */
++
++ /*!
++ \typedef QUtf8StringView::reverse_iterator
++
++ This typedef provides an STL-style const reverse iterator for QUtf8StringView.
++
++ QUtf8StringView does not support mutable reverse iterators, so this is the
++ same as const_reverse_iterator.
++
++ \sa const_reverse_iterator, iterator
++ */
++
++ /*!
++ \typedef QUtf8StringView::const_reverse_iterator
++
++ This typedef provides an STL-style const reverse iterator for QUtf8StringView.
++
++ \sa reverse_iterator, const_iterator
++ */
++
++ /*!
++ \fn QUtf8StringView::QUtf8StringView()
++
++ Constructs a null string view.
++
++ \sa isNull()
++ */
++
++ /*!
++ \fn QUtf8StringView::QUtf8StringView(const storage_type *d, qsizetype n)
++ \internal
++ */
++
++ /*!
++ \fn QUtf8StringView::QUtf8StringView(std::nullptr_t)
++
++ Constructs a null string view.
++
++ \sa isNull()
++ */
++
++ /*!
++ \fn template <typename Char, QUtf8StringView::if_compatible_char<Char> = true> QUtf8StringView::QUtf8StringView(const Char *str, qsizetype len)
++
++ Constructs a string view on \a str with length \a len.
++
++ The range \c{[str,len)} must remain valid for the lifetime of this string view object.
++
++ Passing \nullptr as \a str is safe if \a len is 0, too, and results in a null string view.
++
++ The behavior is undefined if \a len is negative or, when positive, if \a str is \nullptr.
++
++ \constraints \c Char is a compatible
++ character type. The compatible character types are: \c char8_t, \c char, \c{signed char} and
++ \c{unsigned char}.
++ */
++
++ /*!
++ \fn template <typename Char, QUtf8StringView::if_compatible_char<Char> = true> QUtf8StringView::QUtf8StringView(const Char *first, const Char *last)
++
++ Constructs a string view on \a first with length (\a last - \a first).
++
++ The range \c{[first,last)} must remain valid for the lifetime of
++ this string view object.
++
++ Passing \c \nullptr as \a first is safe if \a last is \nullptr, too,
++ and results in a null string view.
++
++ The behavior is undefined if \a last precedes \a first, or \a first
++ is \nullptr and \a last is not.
++
++ \constraints \c Char is a compatible
++ character type. The compatible character types are: \c char8_t, \c char, \c{signed char} and
++ \c{unsigned char}.
++ */
++
++ /*!
++ \fn template <typename Char> QUtf8StringView::QUtf8StringView(const Char *str)
++
++ Constructs a string view on \a str. The length is determined
++ by scanning for the first \c{Char(0)}.
++
++ \a str must remain valid for the lifetime of this string view object.
++
++ Passing \nullptr as \a str is safe and results in a null string view.
++
++ \constraints \a str
++ is not an array and if \c Char is a compatible character type. The
++ compatible character types are: \c char8_t, \c char, \c{signed char} and
++ \c{unsigned char}.
++ */
++
++ /*!
++ \fn template <typename Char, size_t N> QUtf8StringView::QUtf8StringView(const Char (&string)[N])
++
++ Constructs a string view on the character string literal \a string.
++ The view covers the array until the first \c{Char(0)} is encountered,
++ or \c N, whichever comes first.
++ If you need the full array, use fromArray() instead.
++
++ \a string must remain valid for the lifetime of this string view
++ object.
++
++ \constraints \a string
++ is an actual array and if \c Char is a compatible character type. The
++ compatible character types are: \c char8_t, \c char, \c{signed char} and
++ \c{unsigned char}.
++
++ \sa fromArray()
++ */
++
++ /*!
++ \fn template <typename Container, QUtf8StringView::if_compatible_container<Container>> QUtf8StringView::QUtf8StringView(const Container &str)
++
++ Constructs a string view on \a str. The length is taken from \c{std::size(str)}.
++
++ \c{std::data(str)} must remain valid for the lifetime of this string view object.
++
++ The string view will be empty if and only if \c{std::size(str) == 0}. It is unspecified
++ whether this constructor can result in a null string view (\c{std::data(str)} would
++ have to return \nullptr for this).
++
++ \constraints \c Container is a
++ container with a compatible character type as \c{value_type}. The
++ compatible character types are: \c char8_t, \c char, \c{signed char} and
++ \c{unsigned char}.
++
++ \sa isNull(), isEmpty()
++ */
++
++ /*!
++ \fn template <typename Char, size_t Size, QUtf8StringView::if_compatible_char<Char>> QUtf8StringView::fromArray(const Char (&string)[Size])
++
++ Constructs a string view on the full character string literal \a string
++ of \a Size elements, including any trailing \c{Char(0)}. If you don't want
++ the null-terminator included in the view then you can chop() it off
++ when you are certain it is at the end. Alternatively you can use
++ the constructor overload taking an array literal which will create
++ a view up to, but not including, the first null-terminator in the data.
++
++ \a string must remain valid for the lifetime of this string view
++ object.
++
++ This function will work with any array literal if \c Char is a
++ compatible character type. The compatible character types
++ are: \c char8_t, \c char, \c{signed char} and \c{unsigned char}.
++ */
++
++ /*!
++ \fn QString QUtf8StringView::toString() const
++
++ Returns a deep copy of this string view's data as a QString.
++
++ The return value will be a null QString if and only if this string view is null.
++ */
++
++ /*!
++ \fn QUtf8StringView::data() const
++
++ Returns a const pointer to the first code point in the string view.
++
++ \note The character array represented by the return value is \e not null-terminated.
++
++ \sa begin(), end(), utf8()
++ */
++
++ /*!
++ \fn QUtf8StringView::utf8() const
++
++ Returns a const pointer to the first code point in the string view.
++
++ The result is returned as a \c{const char8_t*}, so this function is only available when
++ compiling in C++20 mode.
++
++ \note The character array represented by the return value is \e not null-terminated.
++
++ \sa begin(), end(), data()
++ */
++
++ /*!
++ \fn QUtf8StringView::const_iterator QUtf8StringView::begin() const
++
++ Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first code point in
++ the string view.
++
++ This function is provided for STL compatibility.
++
++ \sa end(), cbegin(), rbegin(), data()
++ */
++
++ /*!
++ \fn QUtf8StringView::const_iterator QUtf8StringView::cbegin() const
++
++ Same as begin().
++
++ This function is provided for STL compatibility.
++
++ \sa cend(), begin(), crbegin(), data()
++ */
++
++ /*!
++ \fn QUtf8StringView::const_iterator QUtf8StringView::end() const
++
++ Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
++ code point after the last code point in the list.
++
++ This function is provided for STL compatibility.
++
++ \sa begin(), cend(), rend()
++ */
++
++ /*! \fn QUtf8StringView::const_iterator QUtf8StringView::cend() const
++
++ Same as end().
++
++ This function is provided for STL compatibility.
++
++ \sa cbegin(), end(), crend()
++ */
++
++ /*!
++ \fn QUtf8StringView::const_reverse_iterator QUtf8StringView::rbegin() const
++
++ Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to the first
++ code point in the string view, in reverse order.
++
++ This function is provided for STL compatibility.
++
++ \sa rend(), crbegin(), begin()
++ */
++
++ /*!
++ \fn QUtf8StringView::const_reverse_iterator QUtf8StringView::crbegin() const
++
++ Same as rbegin().
++
++ This function is provided for STL compatibility.
++
++ \sa crend(), rbegin(), cbegin()
++ */
++
++ /*!
++ \fn QUtf8StringView::const_reverse_iterator QUtf8StringView::rend() const
++
++ Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to one past
++ the last code point in the string view, in reverse order.
++
++ This function is provided for STL compatibility.
++
++ \sa rbegin(), crend(), end()
++ */
++
++ /*!
++ \fn QUtf8StringView::const_reverse_iterator QUtf8StringView::crend() const
++
++ Same as rend().
++
++ This function is provided for STL compatibility.
++
++ \sa crbegin(), rend(), cend()
++ */
++
++ /*!
++ \fn bool QUtf8StringView::empty() const
++
++ Returns whether this string view is empty - that is, whether \c{size() == 0}.
++
++ This function is provided for STL compatibility.
++
++ \sa isEmpty(), isNull(), size(), length()
++ */
++
++ /*!
++ \fn bool QUtf8StringView::isEmpty() const
++
++ Returns whether this string view is empty - that is, whether \c{size() == 0}.
++
++ This function is provided for compatibility with other Qt containers.
++
++ \sa empty(), isNull(), size(), length()
++ */
++
++ /*!
++ \fn bool QUtf8StringView::isNull() const
++
++ Returns whether this string view is null - that is, whether \c{data() == nullptr}.
++
++ This functions is provided for compatibility with other Qt containers.
++
++ \sa empty(), isEmpty(), size(), length()
++ */
++
++ /*!
++ \fn qsizetype QUtf8StringView::size() const
++
++ Returns the size of this string view, in UTF-8 code points (that is,
++ multi-byte sequences count as more than one for the purposes of this function, the same
++ as surrogate pairs in QString and QStringView).
++
++ \sa empty(), isEmpty(), isNull(), length()
++ */
++
++ /*!
++ \fn QUtf8StringView::length() const
++
++ Same as size().
++
++ This function is provided for compatibility with other Qt containers.
++
++ \sa empty(), isEmpty(), isNull(), size()
++ */
++
++ /*!
++ \fn QUtf8StringView::operator[](qsizetype n) const
++
++ Returns the code point at position \a n in this string view.
++
++ The behavior is undefined if \a n is negative or not less than size().
++
++ \sa at(), front(), back()
++ */
++
++ /*!
++ \fn QUtf8StringView::at(qsizetype n) const
++
++ Returns the code point at position \a n in this string view.
++
++ The behavior is undefined if \a n is negative or not less than size().
++
++ \sa operator[](), front(), back()
++ */
++
++ /*!
++ \fn QUtf8StringView::front() const
++
++ Returns the first code point in the string view. Same as first().
++
++ This function is provided for STL compatibility.
++
++ \warning Calling this function on an empty string view constitutes
++ undefined behavior.
++
++ \sa back()
++ */
++
++ /*!
++ \fn QUtf8StringView::back() const
++
++ Returns the last code point in the string view. Same as last().
++
++ This function is provided for STL compatibility.
++
++ \warning Calling this function on an empty string view constitutes
++ undefined behavior.
++
++ \sa front()
++ */
++
++ /*!
++ \fn QUtf8StringView::mid(qsizetype pos, qsizetype n) const
++
++ Returns the substring of length \a n starting at position
++ \a pos in this object.
++
++ \deprecated [6.0] Use sliced() instead in new code.
++
++ Returns an empty string view if \a n exceeds the
++ length of the string view. If there are less than \a n code points
++ available in the string view starting at \a pos, or if
++ \a n is negative (default), the function returns all code points that
++ are available from \a pos.
++
++ \sa first(), last(), sliced(), chopped(), chop(), truncate(), slice()
++ */
++
++ /*!
++ \fn QUtf8StringView::left(qsizetype n) const
++
++ \deprecated [6.0] Use first() instead in new code.
++
++ Returns the substring of length \a n starting at position
++ 0 in this object.
++
++ The entire string view is returned if \a n is greater than or equal
++ to size(), or less than zero.
++
++ \sa first(), last(), sliced(), chopped(), chop(), truncate(), slice()
++ */
++
++ /*!
++ \fn QUtf8StringView::right(qsizetype n) const
++
++ \deprecated [6.0] Use last() instead in new code.
++
++ Returns the substring of length \a n starting at position
++ size() - \a n in this object.
++
++ The entire string view is returned if \a n is greater than or equal
++ to size(), or less than zero.
++
++ \sa first(), last(), sliced(), chopped(), chop(), truncate(), slice()
++ */
++
++ /*!
++ \fn QUtf8StringView::first(qsizetype n) const
++
++ Returns a string view that contains the first \a n code points
++ of this string view.
++
++ \note The behavior is undefined when \a n < 0 or \a n > size().
++
++ \sa last(), sliced(), chopped(), chop(), truncate(), slice()
++ */
++
++ /*!
++ \fn QUtf8StringView::last(qsizetype n) const
++
++ Returns a string view that contains the last \a n code points of this string view.
++
++ \note The behavior is undefined when \a n < 0 or \a n > size().
++
++ \sa first(), sliced(), chopped(), chop(), truncate(), slice()
++ */
++
++ /*!
++ \fn QUtf8StringView::sliced(qsizetype pos, qsizetype n) const
++
++ Returns a string view containing \a n code points of this string view,
++ starting at position \a pos.
++
++ //! [UB-sliced-index-length]
++ \note The behavior is undefined when \a pos < 0, \a n < 0,
++ or \a pos + \a n > size().
++ //! [UB-sliced-index-length]
++
++ \sa first(), last(), chopped(), chop(), truncate(), slice()
++ */
++
++ /*!
++ \fn QUtf8StringView::sliced(qsizetype pos) const
++
++ Returns a string view starting at position \a pos in this object,
++ and extending to its end.
++
++ //! [UB-sliced-index-only]
++ \note The behavior is undefined when \a pos < 0 or \a pos > size().
++ //! [UB-sliced-index-only]
++
++ \sa first(), last(), chopped(), chop(), truncate(), slice()
++ */
++
++ /*!
++ \fn QUtf8StringView &QUtf8StringView::slice(qsizetype pos, qsizetype n)
++ \since 6.8
++
++ Modifies this string view to start at position \a pos, extending for
++ \a n code points.
++
++ \include qutf8stringview.qdoc UB-sliced-index-length
++
++ \sa sliced(), first(), last(), chopped(), chop(), truncate()
++ */
++
++ /*!
++ \fn QUtf8StringView &QUtf8StringView::slice(qsizetype pos)
++ \since 6.8
++ \overload
++
++ Modifies this string view to start at position \a pos, extending
++ to its end.
++
++ \include qutf8stringview.qdoc UB-sliced-index-only
++
++ \sa sliced(), first(), last(), chopped(), chop(), truncate()
++ */
++
++ /*!
++ \fn QUtf8StringView::chopped(qsizetype n) const
++
++ Returns the substring of length size() - \a n starting at the
++ beginning of this object.
++
++ Same as \c{first(size() - n)}.
++
++ \note The behavior is undefined when \a n < 0 or \a n > size().
++
++ \sa sliced(), first(), last(), chop(), truncate(), slice()
++ */
++
++ /*!
++ \fn QUtf8StringView::truncate(qsizetype n)
++
++ Truncates this string view to \a n code points.
++
++ Same as \c{*this = first(n)}.
++
++ \note The behavior is undefined when \a n < 0 or \a n > size().
++
++ \sa sliced(), first(), last(), chopped(), chop()
++ */
++
++ /*!
++ \fn QUtf8StringView::chop(qsizetype n)
++
++ Truncates this string view by \a n code points.
++
++ Same as \c{*this = first(size() - n)}.
++
++ \note The behavior is undefined when \a n < 0 or \a n > size().
++
++ \sa sliced(), first(), last(), chopped(), truncate()
++ */
++
++ /*!
++ \fn int QUtf8StringView::compare(QLatin1StringView str, Qt::CaseSensitivity cs) const
++ \fn int QUtf8StringView::compare(QUtf8StringView str, Qt::CaseSensitivity cs) const
++ \fn int QUtf8StringView::compare(QStringView str, Qt::CaseSensitivity cs) const
++ \since 6.5
++
++ Compares this string view with \a str and returns a negative integer if
++ this string view is less than \a str, a positive integer if it is greater than
++ \a str, and zero if they are equal.
++
++ \include qstring.qdocinc {search-comparison-case-sensitivity} {comparison}
++ */
++
++
++ /*!
++ \fn QUtf8StringView::isValidUtf8() const
++
++ Returns \c true if this string contains valid UTF-8 encoded data,
++ or \c false otherwise.
++
++ \since 6.3
++ */
++
++ /*!
++ \fn template <typename QStringLike> qToUtf8StringViewIgnoringNull(const QStringLike &s);
++ \relates QUtf8StringView
++ \internal
++
++ Convert \a s to a QUtf8StringView ignoring \c{s.isNull()}.
++
++ Returns a string view that references \a{s}'s data, but is never null.
++
++ This is a faster way to convert a QByteArray to a QUtf8StringView,
++ if null QByteArrays can legitimately be treated as empty ones.
++
++ \sa QByteArray::isNull(), QUtf8StringView
++ */
++
++
++ /*!
++ \fn QUtf8StringView::operator std::string_view() const
++ \target qutf8stringview-operator-std-string_view
++ \since 6.7
++
++ Converts this QUtf8StringView object to a
++ \c{std::string_view} object. The returned view will have the
++ same data pointer and length as this view.
++ */
++
++ /*!
++ \fn QUtf8StringView::operator std::u8string_view() const
++ \target qutf8stringview-operator-std-u8string_view
++ \since 6.10
++
++ Converts this QUtf8StringView object to a \c{std::u8string_view}
++ object. The returned view will have the same data pointer and length
++ as this view.
++
++ This function is only available when compiling in C++20 mode.
++ */
++
++ /*!
++ \fn QUtf8StringView::maxSize()
++ \since 6.8
++
++ It returns the maximum number of elements that the view can
++ theoretically represent. In practice, the number can be much smaller,
++ limited by the amount of memory available to the system.
++ */
++
++ /*!
++ \fn QUtf8StringView::max_size() const
++ \since 6.8
++
++ This function is provided for STL compatibility.
++
++ Returns maxSize().
++ */
++
++ /*!
++ \fn template <typename...Args> QString QUtf8StringView::arg(Args &&...args) const
++ \since 6.9
++
++ \include qstringview.cpp qstring-multi-arg
++
++ \sa QString::arg(Args&&...)
++ */