aboutsummaryrefslogtreecommitdiff
path: root/libbutl/semantic-version.ixx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2018-08-14 14:09:32 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2018-08-14 14:09:32 +0200
commit8561af5a2551ec453c9888125de273f2cc2940c0 (patch)
tree4458e955d33f9aaf7e904c8de717803a33ecc81f /libbutl/semantic-version.ixx
parent7c665d965c0ebb259849d5032faa0854c6ae94f2 (diff)
Add support for parsing semantic and semantic-like versions
Diffstat (limited to 'libbutl/semantic-version.ixx')
-rw-r--r--libbutl/semantic-version.ixx78
1 files changed, 78 insertions, 0 deletions
diff --git a/libbutl/semantic-version.ixx b/libbutl/semantic-version.ixx
new file mode 100644
index 0000000..cd88663
--- /dev/null
+++ b/libbutl/semantic-version.ixx
@@ -0,0 +1,78 @@
+// file : libbutl/semantic-version.ixx -*- C++ -*-
+// copyright : Copyright (c) 2014-2018 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+namespace butl
+{
+ inline semantic_version::
+ semantic_version (std::uint64_t mj,
+ std::uint64_t mi,
+ std::uint64_t p,
+ std::string b)
+ : major (mj),
+ minor (mi),
+ patch (p),
+ build (std::move (b))
+ {
+ }
+
+ inline semantic_version::
+ semantic_version (const std::string& s, bool ab)
+ : semantic_version (s, ab ? "-+" : nullptr)
+ {
+ }
+
+ inline semantic_version::
+ semantic_version (const std::string& s, const char* bs)
+ : semantic_version (s, 0, bs)
+ {
+ }
+
+ inline semantic_version::
+ semantic_version (const std::string& s, std::size_t p, bool ab)
+ : semantic_version (s, p, ab ? "-+" : nullptr)
+ {
+ }
+
+ inline int semantic_version::
+ compare (const semantic_version& v, bool ib) const
+ {
+ return (major != v.major ? (major < v.major ? -1 : 1) :
+ minor != v.minor ? (minor < v.minor ? -1 : 1) :
+ patch != v.patch ? (patch < v.patch ? -1 : 1) :
+ ib ? 0 : build.compare (v.build));
+ }
+
+ struct semantic_version_result
+ {
+ optional<semantic_version> version;
+ std::string failure_reason;
+ };
+
+ LIBBUTL_SYMEXPORT semantic_version_result
+ parse_semantic_version_impl (const std::string&, std::size_t, const char*);
+
+ inline optional<semantic_version>
+ parse_semantic_version (const std::string& s, bool ab)
+ {
+ return parse_semantic_version (s, ab ? "-+" : nullptr);
+ }
+
+ inline optional<semantic_version>
+ parse_semantic_version (const std::string& s, const char* bs)
+ {
+ return parse_semantic_version_impl (s, 0, bs).version;
+ }
+
+ inline optional<semantic_version>
+ parse_semantic_version (const std::string& s, std::size_t p, bool ab)
+ {
+ return parse_semantic_version (s, p, ab ? "-+" : nullptr);
+ }
+
+ inline optional<semantic_version>
+ parse_semantic_version (const std::string& s, std::size_t p, const char* bs)
+ {
+ return parse_semantic_version_impl (s, p, bs).version;
+ }
+}