// file : butl/standard-version -*- C++ -*- // copyright : Copyright (c) 2014-2017 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #ifndef BUTL_STANDARD_VERSION #define BUTL_STANDARD_VERSION #include #include // uint*_t #include // size_t #include #include #include namespace butl { // The build2 "standard version" (specific and earliest): // // [~]..[-(a|b).[.[.]]][+] // [~]..- // struct LIBBUTL_EXPORT standard_version { // Invariants: // // 1. allow_earliest // ? (E == 1) || (snapshot_sn == 0) // : (E == 0) == (snapshot_sn == 0) // // 2. snapshot_sn != latest_sn && snapshot_sn != 0 || snapshot_id.empty () // static const std::uint64_t latest_sn = std::uint64_t (~0); std::uint16_t epoch = 0; // 0 if not specified. std::uint64_t version = 0; // AAABBBCCCDDDE std::uint64_t snapshot_sn = 0; // 0 if not specifed, latest_sn if 'z'. std::string snapshot_id; // Empty if not specified. std::uint16_t revision = 0; // 0 if not specified. std::uint16_t major () const noexcept; std::uint16_t minor () const noexcept; std::uint16_t patch () const noexcept; // Note: 0 is ambiguous (-a.0.z). // std::uint16_t pre_release () const noexcept; // Note: return empty if the corresponding component is unspecified. // std::string string () const; // Package version. std::string string_project () const; // Project version (no epoch/rev). std::string string_version () const; // Version only (no snapshot). std::string string_pre_release () const; // Pre-release part only (a.1). std::string string_snapshot () const; // Snapshot part only (1234.1f23). bool empty () const noexcept {return version == 0;} bool alpha () const noexcept; bool beta () const noexcept; bool snapshot () const noexcept {return snapshot_sn != 0;} // Is represented by DDDE being 0001 and snapshot_sn being 0. // // Note that the earliest version is a final alpha pre-release. // bool earliest () const noexcept; int compare (const standard_version&) const noexcept; // Parse the version. Throw std::invalid_argument if the format is not // recognizable or components are invalid. // explicit standard_version (const std::string&, bool allow_earliest = false); explicit standard_version (std::uint64_t version, bool allow_earliest = false); standard_version (std::uint64_t version, const std::string& snapshot, bool allow_earliest = false); standard_version (std::uint16_t epoch, std::uint64_t version, const std::string& snapshot, std::uint16_t revision, bool allow_earliest = false); standard_version (std::uint16_t epoch, std::uint64_t version, std::uint64_t snapshot_sn, std::string snapshot_id, std::uint16_t revision, bool allow_earliest = false); // Create empty version. // standard_version () = default; private: void parse_snapshot (const std::string&, std::size_t&); }; inline bool operator< (const standard_version& x, const standard_version& y) noexcept { return x.compare (y) < 0; } inline bool operator> (const standard_version& x, const standard_version& y) noexcept { return x.compare (y) > 0; } inline bool operator== (const standard_version& x, const standard_version& y) noexcept { return x.compare (y) == 0; } inline bool operator<= (const standard_version& x, const standard_version& y) noexcept { return x.compare (y) <= 0; } inline bool operator>= (const standard_version& x, const standard_version& y) noexcept { return x.compare (y) >= 0; } inline bool operator!= (const standard_version& x, const standard_version& y) noexcept { return !(x == y); } inline std::ostream& operator<< (std::ostream& o, const standard_version& x) { return o << x.string (); } // The build2 "standard version" constraint: // // ('==' | '>' | '<' | '>=' | '<=') // ('(' | '[') (')' | ']') // struct LIBBUTL_EXPORT standard_version_constraint { butl::optional min_version; butl::optional max_version; bool min_open; bool max_open; // Parse the version constraint. Throw std::invalid_argument on error. // explicit standard_version_constraint (const std::string&); // Throw std::invalid_argument if the specified version range is invalid. // standard_version_constraint ( butl::optional min_version, bool min_open, butl::optional max_version, bool max_open); standard_version_constraint (const standard_version& v) : standard_version_constraint (v, false, v, false) {} standard_version_constraint () = default; std::string string () const; bool empty () const noexcept {return !min_version && !max_version;} }; inline bool operator== (const standard_version_constraint& x, const standard_version_constraint& y) { return x.min_version == y.min_version && x.max_version == y.max_version && x.min_open == y.min_open && x.max_open == y.max_open; } inline bool operator!= (const standard_version_constraint& x, const standard_version_constraint& y) { return !(x == y); } inline std::ostream& operator<< (std::ostream& o, const standard_version_constraint& x) { return o << x.string (); } } #include #endif // BUTL_STANDARD_VERSION