[Development] Adding support for version number comparisons

Jake Petroules jake.petroules at petroules.com
Sat May 31 21:09:56 CEST 2014


On 2014-05-31, at 03:00 PM, Thiago Macieira <thiago.macieira at intel.com> wrote:

> 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

This seems to contradict your previous statement, unless you're speaking conceptually here.

To confirm, as far as the code goes, ((QVersion("5.3.0pl1") == QVersion("5.3.0beta1")) === true), yes?

> 
> 	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 at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/development

Big +1 to everything. This approach should serve everyones' use cases; let's get this integration rolling.
-- 
Jake Petroules - jake.petroules at petroules.com
Chief Technology Officer - Petroules Corporation

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/development/attachments/20140531/11527a40/attachment.html>


More information about the Development mailing list