Description
C++ library compare and manipulate versions are available as extensions to the ..-. format complying with Semantic Versioning 2.0.0
semver alternatives and similar libraries
Based on the "Containers" category.
Alternatively, view semver alternatives based on common mentions on social networks and blogs.
-
function2
Improved and configurable drop-in replacement to std::function that supports move only types, multiple overloads and more -
LSHBOX
A c++ toolbox of locality-sensitive hashing (LSH), provides several popular LSH algorithms, also support python and matlab. -
KOMIHASH
Very fast, high-quality hash function, discrete-incremental and streamed hashing-capable (non-cryptographic, inline C/C++) 26GB/s + PRNG
SaaSHub - Software Alternatives and Reviews
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of semver or a related project?
README
_____ _ _
/ ____| | | (_)
| (___ ___ _ __ ___ __ _ _ __ | |_ _ ___
\___ \ / _ \ '_ ` _ \ / _` | '_ \| __| |/ __|
____) | __/ | | | | | (_| | | | | |_| | (__
|_____/ \___|_| |_| |_|\__,_|_| |_|\__|_|\___|
__ __ _ _ _____
\ \ / / (_) (_) / ____|_ _
\ \ / /__ _ __ ___ _ ___ _ __ _ _ __ __ _ | | _| |_ _| |_
\ \/ / _ \ '__/ __| |/ _ \| '_ \| | '_ \ / _` | | | |_ _|_ _|
\ / __/ | \__ \ | (_) | | | | | | | | (_| | | |____|_| |_|
\/ \___|_| |___/_|\___/|_| |_|_|_| |_|\__, | \_____|
__/ |
|___/
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.