Popularity
3.4
Growing
Activity
5.1
-
283
9
33

Description

C++ library compare and manipulate versions are available as extensions to the ..-. format complying with Semantic Versioning 2.0.0

Programming language: C++
License: MIT License
Tags: Containers     Header Only     C++17     Semver    
Latest version: v0.2.2

semver alternatives and similar libraries

Based on the "Containers" category.
Alternatively, view semver alternatives based on common mentions on social networks and blogs.

Do you think we are missing an alternative of semver or a related project?

Add another 'Containers' Library

README

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

Github releases Vcpkg package Conan package [License](LICENSE)

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

[Examples](example/)

  • 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 v7;
  v7.from_string(s); // constexpr and may throw.
  bool success = v7.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](include/semver.hpp).

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

If you are using Conan to manage your dependencies, merely add neargye-semver/x.y.z to your conan's requires, where x.y.z is the release version you want to use.

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](LICENSE)


*Note that all licence references and agreements mentioned in the semver README section above are relevant to that project's source code only.