AppVersion

 avatar
user_6919294
c_cpp
a month ago
9.4 kB
9
Indexable
// CODE BY IRENEUSZ A.

// AppVersion.h
#ifndef APP_VERSION_H
#define APP_VERSION_H

#include <string>
#include <ctime>
#include <sstream>
#include <vector>
#include <algorithm>

// Typ wyliczeniowy dla określenia etapu wydania
enum class ReleaseType {
    Alpha,
    Beta,
    RC,
    RTM
};

// Klasa reprezentująca wersję aplikacji
class AppVersion {
private:
    int m_major;
    int m_minor;
    int m_build;
    int m_revision;
    ReleaseType m_releaseType;

public:
    // Konstruktor domyślny
    AppVersion() : m_major(0), m_minor(0), m_build(0), m_revision(0), m_releaseType(ReleaseType::RTM) {}
    
    /**
     * Konstruktor z parametrami
     * 
     * @param major Główny numer wersji, zwiększany przy znaczących zmianach
     * @param minor Podrzędny numer wersji, zwiększany przy mniejszych zmianach
     * @param build Numer kompilacji, zazwyczaj zwiększany przy każdej kompilacji
     * @param revision Numer rewizji, zazwyczaj używany dla poprawek lub małych zmian
     * @param releaseType Typ wydania (Alpha, Beta, RC, RTM)
     */
    AppVersion(int major, int minor, int build = 0, int revision = 0, ReleaseType releaseType = ReleaseType::RTM)
        : m_major(major), m_minor(minor), m_build(build), m_revision(revision), m_releaseType(releaseType) {}

    // Gettery i settery
    int GetMajor() const { return m_major; }
    void SetMajor(int major) { m_major = major; }

    int GetMinor() const { return m_minor; }
    void SetMinor(int minor) { m_minor = minor; }

    int GetBuild() const { return m_build; }
    void SetBuild(int build) { m_build = build; }

    int GetRevision() const { return m_revision; }
    void SetRevision(int revision) { m_revision = revision; }

    ReleaseType GetReleaseType() const { return m_releaseType; }
    void SetReleaseType(ReleaseType releaseType) { m_releaseType = releaseType; }

    /**
     * Konwertuje wersję do pełnego formatu tekstowego (np. "1.0.0.1 Beta")
     * 
     * @return Pełny format tekstowy wersji
     */
    std::string ToString() const;

    /**
     * Konwertuje wersję do krótkiego formatu (np. "1.0")
     * 
     * @return Krótki format tekstowy wersji
     */
    std::string ToShortString() const;

    /**
     * Konwertuje wersję do formatu zgodnego z Windows (32-bitowa liczba)
     * 
     * @return 32-bitowa reprezentacja wersji
     */
    unsigned int ToWindowsVersion() const;

    /**
     * Sprawdza czy bieżąca wersja jest nowsza od podanej
     * 
     * @param other Wersja do porównania
     * @return true jeśli bieżąca wersja jest nowsza, false w przeciwnym wypadku
     */
    bool IsNewerThan(const AppVersion& other) const;

    /**
     * Sprawdza czy bieżąca wersja jest równa podanej
     * 
     * @param other Wersja do porównania
     * @return true jeśli wersje są identyczne, false w przeciwnym wypadku
     */
    bool Equals(const AppVersion& other) const;

    /**
     * Sprawdza czy bieżąca wersja jest kompatybilna z podaną
     * 
     * @param other Wersja do porównania
     * @return true jeśli wersje są kompatybilne, false w przeciwnym wypadku
     */
    bool IsCompatibleWith(const AppVersion& other) const;

    /**
     * Tworzy obiekt wersji z podanego ciągu znaków
     * 
     * @param versionStr Ciąg znaków reprezentujący wersję
     * @return Obiekt AppVersion
     */
    static AppVersion FromString(const std::string& versionStr);

    /**
     * Automatycznie aktualizuje numery Build i Revision na podstawie aktualnej daty i czasu
     */
    void AutoUpdateBuildInfo();

    /**
     * Przeciążone operatory porównania
     */
    bool operator==(const AppVersion& other) const { return Equals(other); }
    bool operator!=(const AppVersion& other) const { return !Equals(other); }
    bool operator<(const AppVersion& other) const { return other.IsNewerThan(*this); }
    bool operator>(const AppVersion& other) const { return IsNewerThan(other); }
    bool operator<=(const AppVersion& other) const { return !IsNewerThan(other); }
    bool operator>=(const AppVersion& other) const { return !other.IsNewerThan(*this); }
};

/**
 * Stała reprezentująca aktualną wersję aplikacji
 */
const AppVersion APP_VERSION(1, 0, 0, 0, ReleaseType::RTM);

#endif // APP_VERSION_H

// AppVersion.cpp
#include "AppVersion.h"

std::string AppVersion::ToString() const {
    static const std::string ReleaseNames[] = { "Alpha", "Beta", "RC", "RTM" };
    
    std::stringstream ss;
    ss << m_major << "." << m_minor << "." << m_build << "." << m_revision;
    
    if (m_releaseType != ReleaseType::RTM) {
        ss << " " << ReleaseNames[static_cast<int>(m_releaseType)];
    }
    
    return ss.str();
}

std::string AppVersion::ToShortString() const {
    std::stringstream ss;
    ss << m_major << "." << m_minor;
    return ss.str();
}

unsigned int AppVersion::ToWindowsVersion() const {
    // Format używany przez Windows: 
    // starsze 16 bitów to Major i Minor, młodsze 16 bitów to Build i Revision
    return (static_cast<unsigned int>(m_major) << 24) | 
           (static_cast<unsigned int>(m_minor) << 16) | 
           (static_cast<unsigned int>(m_build) << 8) | 
           static_cast<unsigned int>(m_revision);
}

bool AppVersion::IsNewerThan(const AppVersion& other) const {
    // Sprawdzamy hierarchicznie każdy element wersji
    if (m_major > other.m_major) return true;
    if (m_major < other.m_major) return false;
    
    if (m_minor > other.m_minor) return true;
    if (m_minor < other.m_minor) return false;
    
    if (m_build > other.m_build) return true;
    if (m_build < other.m_build) return false;
    
    return m_revision > other.m_revision;
}

bool AppVersion::Equals(const AppVersion& other) const {
    return m_major == other.m_major &&
           m_minor == other.m_minor &&
           m_build == other.m_build &&
           m_revision == other.m_revision &&
           m_releaseType == other.m_releaseType;
}

bool AppVersion::IsCompatibleWith(const AppVersion& other) const {
    // Przykładowa implementacja kompatybilności:
    // Wersje są kompatybilne, jeśli mają ten sam numer Major
    return m_major == other.m_major;
    
    // Można rozbudować to o więcej reguł, np.:
    // return (m_major == other.m_major) && (m_minor >= other.m_minor);
}

AppVersion AppVersion::FromString(const std::string& versionStr) {
    AppVersion result;
    
    // Rozdzielamy wersję i typ wydania
    std::string versionPart = versionStr;
    std::string releasePart;
    
    size_t spacePos = versionStr.find(' ');
    if (spacePos != std::string::npos) {
        versionPart = versionStr.substr(0, spacePos);
        releasePart = versionStr.substr(spacePos + 1);
        
        // Określamy typ wydania
        if (releasePart == "Alpha") {
            result.m_releaseType = ReleaseType::Alpha;
        } else if (releasePart == "Beta") {
            result.m_releaseType = ReleaseType::Beta;
        } else if (releasePart == "RC") {
            result.m_releaseType = ReleaseType::RC;
        } else {
            result.m_releaseType = ReleaseType::RTM;
        }
    }
    
    // Dzielimy ciąg na części oddzielone kropkami
    std::vector<int> parts;
    std::stringstream ss(versionPart);
    std::string item;
    
    while (std::getline(ss, item, '.')) {
        try {
            parts.push_back(std::stoi(item));
        } catch (...) {
            parts.push_back(0);
        }
    }
    
    // Przypisujemy wartości, jeśli są dostępne
    if (parts.size() > 0) result.m_major = parts[0];
    if (parts.size() > 1) result.m_minor = parts[1];
    if (parts.size() > 2) result.m_build = parts[2];
    if (parts.size() > 3) result.m_revision = parts[3];
    
    return result;
}

void AppVersion::AutoUpdateBuildInfo() {
    std::time_t t = std::time(nullptr);
    std::tm* now = std::localtime(&t);
    
    // Obliczanie dnia roku (1-366)
    int dayOfYear = now->tm_yday + 1;
    
    // Używamy numeru dnia w roku jako numer kompilacji
    m_build = dayOfYear;
    
    // Używamy połączenia godziny i minuty jako numer rewizji
    m_revision = now->tm_hour * 100 + now->tm_min;
}

// Przykładowe użycie:
/*
int main() {
    // Tworzenie wersji
    AppVersion version(1, 2, 3, 4, ReleaseType::Beta);
    
    // Wyświetlanie wersji
    std::cout << "Wersja: " << version.ToString() << std::endl;
    std::cout << "Krótka wersja: " << version.ToShortString() << std::endl;
    
    // Parsowanie wersji z tekstu
    AppVersion parsedVersion = AppVersion::FromString("2.3.4.5 Alpha");
    std::cout << "Parsowana wersja: " << parsedVersion.ToString() << std::endl;
    
    // Automatyczne aktualizowanie informacji o kompilacji
    AppVersion autoVersion(1, 0);
    autoVersion.AutoUpdateBuildInfo();
    std::cout << "Auto wersja: " << autoVersion.ToString() << std::endl;
    
    // Porównywanie wersji
    if (version.IsNewerThan(autoVersion)) {
        std::cout << "Wersja " << version.ToString() << " jest nowsza niż " << autoVersion.ToString() << std::endl;
    }
    
    return 0;
}
*/
Editor is loading...
Leave a Comment