Em sex 09 maio 2014, às 11:36:08, Keith Gardner escreveu: > I have been working on adding a class to QtCore (QVersion) to support > storing version numbers, convert to/from QString, and having comparison > operators. My goal was to provide an API to assist in the following use > cases: > > - Plugin loading where there are multiple versions on the same system. > - File format validation. > - Executing an already installed command line application where the > behavior is dependent on the called application's version. > - Performing software installations and updates. > - QMake support for version number comparisons. > > Please share other potential use cases where this might be useful.
Ok, since we can't seem to agree, let's settle on the maximum common denominator: QVersion will only compare the numeric part of a version number. By default, two versions with the same numeric part will compare equally, regardless of any suffixes that may be present. Therefore, by default, given: QVersion a("5.3.0"); QVersion b("5.3.0pl1"); QVersion c("5.3.0beta1"); a != b != c; // since they aren't equal QVersion::compare(a, b) == 0; QVersion::compare(b, c) == 0; We will also provide an overload for the QVersion::compare function taking a functor: template <typename SuffixCompare> static inline int compare(const QVersion &a, const QVersion &b, SuffixCompare suffixCompare) { int cmp = compare(a, b); if (cmp) return cmp; return suffixCompare(a.suffix(), b.suffix()); } Thus, if you want to implement a comparison like OpenSSL's, you can do: QVersion::compare(a, b, [](auto a, auto b) { return QString::compare(a, b, Qt::CaseInsensitive); }); If you want a more complex comparison like I had wanted, you'd do: static int priorityOrder(const QString &suffix) { if (suffix.isEmpty()) return 0; return suffix.startsWith("alpha") || suffix.startsWith("beta") || suffix.startsWith("rc") ? -1 : 1; } static int myCompare(const QString &a, const QString &b) { int a_prio = priorityOrder(a); int b_prio = priorityOrder(b); if (a_prio != b_prio || a_prio == 0) return a_prio - b_prio; return QString::compare(a, b, Qt::CaseInsensitive); } And then you'd use: QVersion::compare(a, b, myCompare); -- Thiago Macieira - thiago.macieira (AT) intel.com Software Architect - Intel Open Source Technology Center _______________________________________________ Development mailing list Development@qt-project.org http://lists.qt-project.org/mailman/listinfo/development