File indexing completed on 2024-04-21 04:49:10

0001 /*
0002     SPDX-FileCopyrightText: 1998-2009 Sebastian Trueg <trueg@k3b.org>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #ifndef _K3B_VERSION_H_
0007 #define _K3B_VERSION_H_
0008 
0009 #include "k3b_export.h"
0010 
0011 #include <QSharedDataPointer>
0012 #include <QString>
0013 
0014 namespace K3b {
0015     /**
0016      * \brief Representation of a version.
0017      *
0018      * Version represents a version consisting of a major version (accessible via majorVersion()),
0019      * a minor version (accessible via minorVersion()), a patchLevel (accessible via patchLevel()),
0020      * and a suffix (accessible via suffix()).
0021      *
0022      * The major version is mandatory while all other fields are optional (in case of the minor version
0023      * and the patchlevel -1 means that the field is undefined).
0024      *
0025      * Version tries to treat version suffixes in an "intelligent" way to properly compare versions
0026      * (see compareSuffix() for more details).
0027      *
0028      * Version may also be used everywhere a QString is needed as it automatically converts to a
0029      * string representation using createVersionString().
0030      */
0031     class LIBK3B_EXPORT Version
0032     {
0033     public:
0034         /**
0035          * construct an empty version object
0036          * which is invalid
0037          * @ see isValid()
0038          */
0039         Version();
0040 
0041         /**
0042          * copy constructor
0043          */
0044         Version( const Version& );
0045 
0046         /**
0047          * this constructor tries to parse the given version string
0048          */
0049         Version( const QString& version );
0050 
0051         /**
0052          * sets the version and generates a version string from it
0053          */
0054         Version( int majorVersion, int minorVersion, int pachlevel = -1, const QString& suffix = QString() );
0055 
0056         /**
0057          * Destructor
0058          */
0059         ~Version();
0060 
0061         /**
0062          * Copy operator
0063          */
0064         Version& operator=( const Version& );
0065 
0066         Version& operator=( const QString& v );
0067 
0068         /**
0069          * tries to parse the version string
0070          * used by the constructor
0071          */
0072         void setVersion( const QString& );
0073 
0074         bool isValid() const;
0075 
0076         /**
0077          * sets the version and generates a version string from it
0078          * used by the constructor
0079          *
0080          * If minorVersion or pachlevel are -1 they will not be used when generating the version string.
0081          */
0082         void setVersion( int majorVersion, int minorVersion = -1, int patchlevel = -1, const QString& suffix = QString() );
0083 
0084         QString toString() const;
0085         QString versionString() const;
0086         int majorVersion() const;
0087         int minorVersion() const;
0088         int patchLevel() const;
0089         QString suffix() const;
0090 
0091         /**
0092          * just to make it possible to use as a QString
0093          */
0094         operator QString() const { return toString(); }
0095 
0096         /**
0097          * \return A new Version object which equals this one except that the suffix is empty.
0098          */
0099         Version simplify() const;
0100 
0101         /**
0102          * If minorVersion or pachlevel are -1 they will not be used when generating the version string.
0103          * If minorVersion is -1 patchlevel will be ignored.
0104          */
0105         static QString createVersionString( int majorVersion,
0106                                             int minorVersion = -1,
0107                                             int patchlevel = -1,
0108                                             const QString& suffix = QString() );
0109 
0110         /**
0111          * "Intelligent" comparison of two version suffixes.
0112          *
0113          * This method checks for the following types of suffixes and treats them in the
0114          * following order:
0115          *
0116          * [empty prefix] > rcX > preX > betaX > alphaX = aX (where X is a number)
0117          *
0118          * Every other suffixes are compared alphanumerical.
0119          * An empty prefix is always considered newer than an unknown non-empty suffix (e.g. not one of the above.)
0120          *
0121          * @return \li -1 if suffix1 is less than suffix2
0122          *         \li 0 if suffix1 equals suffix2 (be aware that this is not the same as comparing to strings as
0123          *             alphaX equals aX in this case.)
0124          *         \li 1 if suffix1 is greater than suffix2
0125          */
0126         static int compareSuffix( const QString& suffix1, const QString& suffix2 );
0127 
0128     private:
0129         class Private;
0130         QSharedDataPointer<Private> d;
0131     };
0132 
0133 
0134     LIBK3B_EXPORT bool operator<( const Version& v1, const Version& v2 );
0135     LIBK3B_EXPORT bool operator>( const Version& v1, const Version& v2 );
0136     LIBK3B_EXPORT bool operator==( const Version& v1, const Version& v2 );
0137     LIBK3B_EXPORT bool operator<=( const Version& v1, const Version& v2 );
0138     LIBK3B_EXPORT bool operator>=( const Version& v1, const Version& v2 );
0139 }
0140 
0141 #endif