Giter Site home page Giter Site logo

semver's Introduction

         _____                            _   _
        / ____|                          | | (_)
       | (___   ___ _ __ ___   __ _ _ __ | |_ _  ___
        \___ \ / _ \ '_ ` _ \ / _` | '_ \| __| |/ __|
        ____) |  __/ | | | | | (_| | | | | |_| | (__
       |_____/ \___|_| |_| |_|\__,_|_| |_|\__|_|\___|
__      __           _             _                _____
\ \    / /          (_)           (_)              / ____|_     _
 \ \  / /__ _ __ ___ _  ___  _ __  _ _ __   __ _  | |   _| |_ _| |_
  \ \/ / _ \ '__/ __| |/ _ \| '_ \| | '_ \ / _` | | |  |_   _|_   _|
   \  /  __/ |  \__ \ | (_) | | | | | | | | (_| | | |____|_|   |_|
    \/ \___|_|  |___/_|\___/|_| |_|_|_| |_|\__, |  \_____|
                                            __/ |
                                           |___/

Github releases Vcpkg package License Build Status Build status Codacy Badge

C++ library compare and manipulate versions are available as extensions to the <major>.<minor>.<patch>-<prerelease_type>.<prerelease_number> format complying with Semantic Versioning 2.0.0

Features

  • C++17
  • Header-only
  • Dependency-free
  • Constexpr comparison: <, <=, ==, !=, > >=
  • Constexpr from string
  • Constexpr to string
  • Constexpr range matching
  • Create

    constexpr version v1 = version{1, 2, 3, prerelease::rc, 4};
    constexpr version v2 = v1;
  • Сomparison

    constexpr semver::version v1{1, 4, 3};
    constexpr semver::version v2{1, 2, 4, semver::prerelease::alpha, 10};
    static_assert(v1 != v2);
    static_assert(v1 > v2);
    static_assert(v1 >= v2);
    static_assert(v2 < v1);
    static_assert(v2 <= v1);
  • To string

    semver::version v{1, 2, 3, prerelease::rc, 4};
    
    // To string.
    std::string s1 = v.to_string(); // may throw.
    
    // Non-member to string.
    std::string s2 = semver::to_string(v); // may throw.
    
    std::array<char, 32> str = {};
    
    // constexpr to chars, like <https://en.cppreference.com/w/cpp/utility/to_chars>.
    auto [p, ec] = v.to_chars(str.data(), str.data() + str.size()); // constexpr and no throw.
    
    // Non-member constexpr to chars, like <https://en.cppreference.com/w/cpp/utility/to_chars>.
    auto [p, ec] = semver::to_chars(str.data(), str.data() + str.size(), v); // constexpr and no throw.
  • From string

    std::string_view s = "1.2.3-rc.4";
    
    // From chars.
    semver::version v1{s}; // constexpr and may throw.
    
    // User-defined literals '_version'.
    semver::version v2 = "1.2.3-rc.4"_version; // constexpr and may throw.
    
    // constexpr from_chars, like <https://en.cppreference.com/w/cpp/utility/from_chars>.
    semver::version v3;
    auto [p, ec] = v3.to_chars(str.data(), str.data() + str.size()); // constexpr and no throw.
    
    // Non-member constexpr from chars, like <https://en.cppreference.com/w/cpp/utility/from_chars>.
    semver::version v4;
    auto [p, ec] = semver::to_chars(str.data(), str.data() + str.size(), v4); // constexpr and no throw.
    
    // Non-member from string.
    semver::version v5 = semver::from_string(s); // constexpr and may throw.
    std::optional<version> v6 = semver::from_string_noexcept(s); // constexpr and no throw.
    
    // From string.
    semver::version v6;
    v7.from_string(s); // constexpr and may throw.
    bool success = v8.from_string_noexcept(s); // constexpr and no throw.
  • Range matching

    constexpr auto range = semver::range(">=1.0.0 <2.0.0 || >3.2.1");
    constexpr auto version = semver::version("1.2.3");
    if (range.satisfies(version)) {
      // Do something.
    }
  • Range matching with prerelease tag

    constexpr auto range = semver::range(">1.2.3-beta.1");
    constexpr auto version = semver::version("3.4.5-alpha.0");
    
    // By default, version is allowed to satisfy range if at least one comparator with the same [major, minor, patch] has a prerelease tag.
    static_assert(!range.satisfies(version));
    // Suppress this behavior and treat prerelease versions as normal.
    static_assert(range.satisfies(version, semver::range::option::include_prerelease));

Integration

You should add required file semver.hpp.

If you are using vcpkg on your project for external dependencies, then you can use the neargye-semver package.

Alternatively, you can use something like CPM which is based on CMake's Fetch_Content module.

CPMAddPackage(
    NAME semver
    GITHUB_REPOSITORY Neargye/semver
    GIT_TAG x.y.z # Where `x.y.z` is the release version you want to use.
)

Compiler compatibility

  • Clang/LLVM >= 5
  • MSVC++ >= 14.11 / Visual Studio >= 2017
  • Xcode >= 10
  • GCC >= 7

Licensed under the MIT License

semver's People

Contributors

deepin-community-ci-bot[bot] avatar xzl01 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.