From 8561af5a2551ec453c9888125de273f2cc2940c0 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 14 Aug 2018 14:09:32 +0200 Subject: Add support for parsing semantic and semantic-like versions --- libbutl/semantic-version.ixx | 78 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 libbutl/semantic-version.ixx (limited to 'libbutl/semantic-version.ixx') 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 version; + std::string failure_reason; + }; + + LIBBUTL_SYMEXPORT semantic_version_result + parse_semantic_version_impl (const std::string&, std::size_t, const char*); + + inline optional + parse_semantic_version (const std::string& s, bool ab) + { + return parse_semantic_version (s, ab ? "-+" : nullptr); + } + + inline optional + parse_semantic_version (const std::string& s, const char* bs) + { + return parse_semantic_version_impl (s, 0, bs).version; + } + + inline optional + parse_semantic_version (const std::string& s, std::size_t p, bool ab) + { + return parse_semantic_version (s, p, ab ? "-+" : nullptr); + } + + inline optional + parse_semantic_version (const std::string& s, std::size_t p, const char* bs) + { + return parse_semantic_version_impl (s, p, bs).version; + } +} -- cgit v1.1