6#ifndef QVERSIONNUMBER_H
7#define QVERSIONNUMBER_H
9#include <QtCore/qlist.h>
10#include <QtCore/qmetatype.h>
11#include <QtCore/qnamespace.h>
12#include <QtCore/qstring.h>
13#include <QtCore/qtypeinfo.h>
21#ifndef QT_NO_DATASTREAM
38 InlineSegmentMarker = Q_BYTE_ORDER ==
Q_LITTLE_ENDIAN ? 0 :
sizeof(
void *) - 1,
39 InlineSegmentStartIdx = !InlineSegmentMarker,
40 InlineSegmentCount =
sizeof(
void *) - 1
42 static_assert(InlineSegmentCount >= 3);
51 qint8 inline_segments[
sizeof(
void *)];
56 SegmentStorage() noexcept : dummy(1) {}
60 if (dataFitsInline(seg.
data(), seg.
size()))
61 setInlineData(seg.
data(), seg.
size());
66 Q_CORE_EXPORT
void setListData(
const QList<int> &seg);
68 SegmentStorage(
const SegmentStorage &
other)
70 if (
other.isUsingPointer())
71 setListData(*
other.pointer_segments);
76 SegmentStorage &operator=(
const SegmentStorage &
other)
78 if (isUsingPointer() &&
other.isUsingPointer()) {
79 *pointer_segments = *
other.pointer_segments;
80 }
else if (
other.isUsingPointer()) {
81 setListData(*
other.pointer_segments);
84 delete pointer_segments;
90 SegmentStorage(SegmentStorage &&
other) noexcept
96 QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(SegmentStorage)
100 std::swap(dummy,
other.dummy);
105 if (dataFitsInline(std::as_const(seg).
data(), seg.
size()))
106 setInlineData(std::as_const(seg).
data(), seg.
size());
108 setListData(std::move(seg));
111 Q_CORE_EXPORT
void setListData(
QList<int> &&seg);
113 explicit SegmentStorage(std::initializer_list<int>
args)
116 explicit SegmentStorage(
const int *
first,
const int *last)
121 setListData(
first, last);
125 Q_CORE_EXPORT
void setListData(
const int *
first,
const int *last);
127 ~SegmentStorage() {
if (isUsingPointer())
delete pointer_segments; }
129 bool isUsingPointer()
const noexcept
130 {
return (inline_segments[InlineSegmentMarker] & 1) == 0; }
133 {
return isUsingPointer() ? pointer_segments->size() : (inline_segments[InlineSegmentMarker] >> 1); }
138 inline_segments[InlineSegmentMarker] =
qint8(1 + 2 *
len);
145 return isUsingPointer() ?
146 pointer_segments->at(
index) :
147 inline_segments[InlineSegmentStartIdx +
index];
150 void setSegments(
int len,
int maj,
int min = 0,
int mic = 0)
153 int data[] = { maj, min, mic };
156 setVector(
len, maj, min, mic);
163 if (
len > InlineSegmentCount)
174#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
177#elif Q_BYTE_ORDER == Q_BIG_ENDIAN
179 dummy |=
quintptr(
data[
i] & 0xFF) << (8 * (
sizeof(
void *) -
i - 1));
184 inline_segments[InlineSegmentStartIdx +
i] =
data[
i] & 0xFF;
188 Q_CORE_EXPORT
void setVector(
int len,
int maj,
int min,
int mic);
205 template <qsizetype N>
207 : m_segments(sec.
begin(), sec.
end())
211 { m_segments.setSegments(1, maj); }
214 { m_segments.setSegments(2, maj, min); }
217 { m_segments.setSegments(3, maj, min, mic); }
219 [[nodiscard]]
inline bool isNull() const noexcept
239 {
return (m_segments.size() >
index) ? m_segments.at(
index) : 0; }
242 {
return m_segments.size(); }
253#if QT_DEPRECATED_SINCE(6, 4) && QT_POINTER_SIZE != 4
265 *suffixIndex = int(
n);
273#if QT_CORE_REMOVED_SINCE(6, 4)
280 {
return compare(lhs, rhs) > 0; }
283 {
return compare(lhs, rhs) >= 0; }
286 {
return compare(lhs, rhs) < 0; }
289 {
return compare(lhs, rhs) <= 0; }
292 {
return compare(lhs, rhs) == 0; }
295 {
return compare(lhs, rhs) != 0; }
298#ifndef QT_NO_DATASTREAM
306#ifndef QT_NO_DEBUG_STREAM
313#ifndef QT_NO_DATASTREAM
321 template<
typename Integer>
323 std::is_integral<Integer>::value,
bool>
::type;
325 template<
typename Integer>
327 std::is_integral<Integer>::value
330 && !std::is_signed<Integer>::value)),
bool>
::type;
332 template<
typename Integer, if_val
id_segment_type<Integer> = true>
337 && ((std::numeric_limits<Integer>::max)() <
Integer(SegmentUnknown)
341 template<
typename Major,
typename Minor,
342 if_valid_segment_type<Major> =
true,
343 if_valid_segment_type<Minor> =
true>
351 template<
typename Major, if_val
id_segment_type<Major> = true>
358 template<
typename Minor, if_val
id_segment_type<Minor> = true>
365 template<
typename Integer, if_val
id_value_type<Integer> = true>
384 template<
typename Integer, if_val
id_value_type<Integer> = true>
423 return lhs != rhs && !(lhs < rhs);
428 return lhs == rhs || lhs < rhs;
433 return lhs == rhs || !(lhs < rhs);
437 enum { SegmentUnknown = 0xff };
439#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
441 : m_minorVersion(minor), m_majorVersion(major) {}
443 quint8 m_minorVersion = SegmentUnknown;
444 quint8 m_majorVersion = SegmentUnknown;
447 : m_majorVersion(major), m_minorVersion(minor) {}
449 quint8 m_majorVersion = SegmentUnknown;
450 quint8 m_minorVersion = SegmentUnknown;
457#ifndef QT_NO_DEBUG_STREAM
\inmodule QtCore\reentrant
qsizetype size() const noexcept
\macro QT_RESTRICTED_CAST_FROM_ASCII
friend constexpr bool operator>=(QTypeRevision lhs, QTypeRevision rhs)
static constexpr bool isValidSegment(Integer segment)
Returns true if the given number can be used as either major or minor version in a QTypeRevision.
friend constexpr bool operator==(QTypeRevision lhs, QTypeRevision rhs)
static constexpr QTypeRevision fromVersion(Major majorVersion, Minor minorVersion)
Produces a QTypeRevision from the given majorVersion and minorVersion, both of which need to be a val...
friend constexpr bool operator<(QTypeRevision lhs, QTypeRevision rhs)
static constexpr QTypeRevision fromEncodedVersion(Integer value)
Produces a QTypeRevision from the given value.
constexpr bool hasMinorVersion() const
Returns true if the minor version is known, otherwise false.
static constexpr QTypeRevision zero()
Produces a QTypeRevision with major and minor version {0}.
typename std::enable_if< std::is_integral< Integer >::value &&(sizeof(Integer) > sizeof(quint16)||(sizeof(Integer)==sizeof(quint16) &&!std::is_signed< Integer >::value)), bool >::type if_valid_value_type
typename std::enable_if< std::is_integral< Integer >::value, bool >::type if_valid_segment_type
static constexpr QTypeRevision fromMinorVersion(Minor minorVersion)
Produces a QTypeRevision from the given minorVersion with an invalid major version.
constexpr bool hasMajorVersion() const
Returns true if the major version is known, otherwise false.
constexpr Integer toEncodedVersion() const
Transforms the revision into an integer value, encoding the minor version into the least significant ...
constexpr quint8 minorVersion() const
Returns the minor version encoded in the revision.
static constexpr QTypeRevision fromMajorVersion(Major majorVersion)
Produces a QTypeRevision from the given majorVersion with an invalid minor version.
friend constexpr bool operator<=(QTypeRevision lhs, QTypeRevision rhs)
constexpr bool isValid() const
Returns true if the major version or the minor version is known, otherwise false.
friend constexpr bool operator>(QTypeRevision lhs, QTypeRevision rhs)
constexpr quint8 majorVersion() const
Returns the major version encoded in the revision.
constexpr QTypeRevision()=default
Produces an invalid revision.
friend constexpr bool operator!=(QTypeRevision lhs, QTypeRevision rhs)
QVersionNumber(std::initializer_list< int > args)
Construct a version number from the std::initializer_list specified by args.
Q_CORE_EXPORT bool isPrefixOf(const QVersionNumber &other) const noexcept
Returns true if the current version number is contained in the other version number,...
friend bool operator<=(const QVersionNumber &lhs, const QVersionNumber &rhs) noexcept
Returns true if lhs is less than or equal to rhs; otherwise returns false.
friend bool operator<(const QVersionNumber &lhs, const QVersionNumber &rhs) noexcept
Returns true if lhs is less than rhs; otherwise returns false.
friend Q_CORE_EXPORT QDataStream & operator>>(QDataStream &in, QVersionNumber &version)
Reads a version number from stream in and stores it in version.
bool isNull() const noexcept
Returns true if there are zero numerical segments, otherwise returns false.
int minorVersion() const noexcept
Returns the minor version number, that is, the second segment.
static Q_CORE_EXPORT QVersionNumber commonPrefix(const QVersionNumber &v1, const QVersionNumber &v2)
QVersionNumber QVersionNumber::commonPrefix(const QVersionNumber &v1, ...
int majorVersion() const noexcept
Returns the major version number, that is, the first segment.
QVersionNumber(const QList< int > &seg)
Constructs a version number from the list of numbers contained in seg.
QVersionNumber() noexcept
Produces a null version.
static Q_CORE_EXPORT QVersionNumber fromString(QAnyStringView string, qsizetype *suffixIndex=nullptr)
friend bool operator>(const QVersionNumber &lhs, const QVersionNumber &rhs) noexcept
Returns true if lhs is greater than rhs; otherwise returns false.
friend bool operator==(const QVersionNumber &lhs, const QVersionNumber &rhs) noexcept
Returns true if lhs is equal to rhs; otherwise returns false.
qsizetype segmentCount() const noexcept
Returns the number of integers stored in segments().
friend bool operator!=(const QVersionNumber &lhs, const QVersionNumber &rhs) noexcept
Returns true if lhs is not equal to rhs; otherwise returns false.
QVersionNumber(const QVarLengthArray< int, N > &sec)
bool isNormalized() const noexcept
Returns true if the version number does not contain any trailing zeros, otherwise returns false.
Q_CORE_EXPORT QString toString() const
Returns a string with all of the segments delimited by a period ({.}).
Q_CORE_EXPORT QVersionNumber normalized() const
Returns an equivalent version number but with all trailing zeros removed.
QVersionNumber(int maj, int min, int mic)
Constructs a QVersionNumber consisting of the major, minor, and micro version numbers maj,...
QVersionNumber(int maj, int min)
Constructs a QVersionNumber consisting of the major and minor version numbers maj and min,...
QVersionNumber(int maj)
Constructs a QVersionNumber consisting of just the major version number maj.
int segmentAt(qsizetype index) const noexcept
Returns the segment value at index.
friend Q_CORE_EXPORT size_t qHash(const QVersionNumber &key, size_t seed)
int microVersion() const noexcept
Returns the micro version number, that is, the third segment.
friend bool operator>=(const QVersionNumber &lhs, const QVersionNumber &rhs) noexcept
Returns true if lhs is greater than or equal to rhs; otherwise returns false.
static Q_CORE_EXPORT int compare(const QVersionNumber &v1, const QVersionNumber &v2) noexcept
Compares v1 with v2 and returns an integer less than, equal to, or greater than zero,...
QVersionNumber(QList< int > &&seg)
Move-constructs a version number from the list of numbers contained in seg.
Combined button and popup list for selecting options.
#define QT_WARNING_DISABLE_GCC(text)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
GLint GLfloat GLfloat GLfloat v2
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
static Q_CONSTINIT QBasicAtomicInteger< unsigned > seed
QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator)
#define QT_DEPRECATED_VERSION_X_6_4(text)
#define Q_DECLARE_TYPEINFO(TYPE, FLAGS)
QT_BEGIN_NAMESPACE typedef signed char qint8
Q_CORE_EXPORT size_t qHash(const QVersionNumber &key, size_t seed=0)
Q_CORE_EXPORT QDataStream & operator<<(QDataStream &out, const QVersionNumber &version)
Q_CORE_EXPORT QDataStream & operator>>(QDataStream &in, QVersionNumber &version)
if(qFloatDistance(a, b)<(1<< 7))
[0]
QTextStream out(stdout)
[7]