aboutsummaryrefslogtreecommitdiff
path: root/libbutl/standard-version.mxx
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2021-09-28 19:24:31 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2021-09-28 20:29:59 +0300
commitdf1ef68cd8e8582724ce1192bfc202e0b9aeaf0c (patch)
treeb731ca4c68e60c00c7e7d499dbf4868ee7b71f44 /libbutl/standard-version.mxx
parent7a4fc37f264cdb67f2f83fa92703c869215bbc86 (diff)
Get rid of C++ modules related code and rename *.mxx files to *.hxx
Diffstat (limited to 'libbutl/standard-version.mxx')
-rw-r--r--libbutl/standard-version.mxx357
1 files changed, 0 insertions, 357 deletions
diff --git a/libbutl/standard-version.mxx b/libbutl/standard-version.mxx
deleted file mode 100644
index b86e3a9..0000000
--- a/libbutl/standard-version.mxx
+++ /dev/null
@@ -1,357 +0,0 @@
-// file : libbutl/standard-version.mxx -*- C++ -*-
-// license : MIT; see accompanying LICENSE file
-
-#ifndef __cpp_modules_ts
-#pragma once
-#endif
-
-// C includes.
-
-#ifndef __cpp_lib_modules_ts
-#include <string>
-#include <cstdint> // uint*_t
-#include <cstddef> // size_t
-#include <ostream>
-#endif
-
-// Other includes.
-
-#ifdef __cpp_modules_ts
-export module butl.standard_version;
-#ifdef __cpp_lib_modules_ts
-import std.core;
-import std.io;
-#endif
-import butl.optional;
-#else
-#include <libbutl/optional.mxx>
-#endif
-
-#include <libbutl/export.hxx>
-
-// FreeBSD defines these macros in its <sys/types.h>.
-//
-#ifdef major
-# undef major
-#endif
-
-#ifdef minor
-# undef minor
-#endif
-
-LIBBUTL_MODEXPORT namespace butl
-{
- // The build2 "standard version" (normal, earliest, and stub):
- //
- // [+<epoch>-]<maj>.<min>.<patch>[-(a|b).<num>[.<snapsn>[.<snapid>]]][+<rev>]
- // [+<epoch>-]<maj>.<min>.<patch>-
- // 0[+<rev>]
- //
- // The normal version can be release, final pre-release, or a pre-release
- // snapshot (release is naturally always final). Pre-release can be alpha or
- // beta.
- //
- // The numeric version format is AAAAABBBBBCCCCCDDDE where:
- //
- // AAAAA - major version number
- // BBBBB - minor version number
- // CCCCC - patch version number
- // DDD - alpha / beta (DDD + 500) version number
- // E - final (0) / snapshot (1)
- //
- // When DDDE is not 0, 1 is subtracted from AAAAABBBBBCCCCC. For example:
- //
- // Version AAAAABBBBBCCCCCDDDE
- //
- // 0.1.0 0000000001000000000
- // 0.1.2 0000000001000020000
- // 1.2.3 0000100002000030000
- // 2.2.0-a.1 0000200001999990010
- // 3.0.0-b.2 0000299999999995020
- // 2.2.0-a.1.z 0000200001999990011
- //
- // Stub is represented as ~0 (but is not considered a pre-release).
- //
- struct LIBBUTL_SYMEXPORT standard_version
- {
- // Invariants:
- //
- // 1. allow_earliest
- // ? (E == 1) || (snapshot_sn == 0)
- // : (E == 0) == (snapshot_sn == 0)
- //
- // 2. version != 0 || allow_stub && epoch == 0 && snapshot_sn == 0
- //
- // 3. 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 = 1; // 0 if a stub, 1 if not specified.
- std::uint64_t version = 0; // AAAAABBBBBCCCCCDDDE or ~0 for stub.
- 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::uint32_t major () const noexcept;
- std::uint32_t minor () const noexcept;
- std::uint32_t patch () const noexcept;
-
- // Return the alpha/beta version number if pre-release and nullopt
- // otherwise.
- //
- // Can be used as a predicate and also to get the value.
- //
- optional<std::uint16_t> alpha () const noexcept;
- optional<std::uint16_t> beta () const noexcept;
-
- // Return the DDD version part if a pre-release and nullopt otherwise.
- //
- // Can be used as a predicate and also to get the value. Note that 0 is
- // ambiguous (-[ab].0.z, or earliest version; see below).
- //
- optional<std::uint16_t> pre_release () const noexcept;
-
- // String representations.
- //
- // Note: return empty if the corresponding component is unspecified.
- //
- std::string string () const; // Package version.
-
- // Project version (no epoch).
- //
- std::string string_project (bool revision = false) const;
-
- std::string string_project_id () const; // Project version id (no snapsn).
- 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).
-
- // Predicates. See also alpha(), beta(), and pre_release() above.
- //
- // The earliest version is represented as the (otherwise illegal) DDDE
- // value 0001 and snapshot_sn 0. Note that the earliest version is a final
- // alpha pre-release.
- //
- bool empty () const noexcept {return version == 0;}
- bool stub () const noexcept {return version == std::uint64_t (~0);}
- bool earliest () const noexcept;
- bool release () const noexcept;
- bool snapshot () const noexcept {return snapshot_sn != 0;}
- bool latest_snapshot () const noexcept;
- bool final () const noexcept;
-
- // Comparison of empty or stub versions doesn't make sense.
- //
- int
- compare (const standard_version& v,
- bool ignore_revision = false) const noexcept
- {
- if (epoch != v.epoch)
- return epoch < v.epoch ? -1 : 1;
-
- if (version != v.version)
- return version < v.version ? -1 : 1;
-
- if (snapshot_sn != v.snapshot_sn)
- return snapshot_sn < v.snapshot_sn ? -1 : 1;
-
- if (!ignore_revision)
- {
- if (revision != v.revision)
- return revision < v.revision ? -1 : 1;
- }
-
- return 0;
- }
-
- // Parse the version. Throw std::invalid_argument if the format is not
- // recognizable or components are invalid.
- //
- enum flags
- {
- none = 0,
- allow_earliest = 0x01, // Allow <major>.<minor>.<patch>- form.
- allow_stub = 0x02 // Allow 0[+<revision>] form.
- };
-
- explicit
- standard_version (const std::string&, flags = none);
-
- explicit
- standard_version (std::uint64_t version, flags = none);
-
- standard_version (std::uint64_t version,
- const std::string& snapshot,
- flags = none);
-
- // Note that the default epoch is 1 for real versions and 0 for stubs.
- //
- standard_version (std::uint16_t epoch,
- std::uint64_t version,
- const std::string& snapshot,
- std::uint16_t revision,
- flags = none);
-
- standard_version (std::uint16_t epoch,
- std::uint64_t version,
- std::uint64_t snapshot_sn,
- std::string snapshot_id,
- std::uint16_t revision,
- flags = none);
-
- // Version as separate major, minor, patch, and pre-release components.
- // Note that the pre-release here is in the DDD form, that is, incremented
- // by 500 for betas.
- //
- standard_version (std::uint16_t epoch,
- std::uint32_t major,
- std::uint32_t minor,
- std::uint32_t patch,
- std::uint16_t pre_release = 0,
- std::uint16_t revision = 0);
-
- standard_version (std::uint16_t epoch,
- std::uint32_t major,
- std::uint32_t minor,
- std::uint32_t patch,
- std::uint16_t pre_release,
- std::uint64_t snapshot_sn,
- std::string snapshot_id,
- std::uint16_t revision = 0);
-
- // Create empty version.
- //
- standard_version () {} // = default; @@ MOD VC
- };
-
- // Try to parse a string as a standard version returning nullopt if invalid.
- //
- LIBBUTL_SYMEXPORT optional<standard_version>
- parse_standard_version (const std::string&,
- standard_version::flags = standard_version::none);
-
- 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 ();
- }
-
- inline standard_version::flags
- operator& (standard_version::flags, standard_version::flags);
-
- inline standard_version::flags
- operator| (standard_version::flags, standard_version::flags);
-
- inline standard_version::flags
- operator&= (standard_version::flags&, standard_version::flags);
-
- inline standard_version::flags
- operator|= (standard_version::flags&, standard_version::flags);
-
- // The build2 "standard version" constraint:
- //
- // ('==' | '>' | '<' | '>=' | '<=') <version>
- // ('^' | '~') <version>
- // ('(' | '[') <version> <version> (')' | ']')
- //
- // The version may be `$` which refers to the dependent package version.
- //
- struct LIBBUTL_SYMEXPORT standard_version_constraint
- {
- butl::optional<standard_version> min_version;
- butl::optional<standard_version> 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&);
-
- // As above but also completes the special `$` version using the specified
- // dependent package version.
- //
- standard_version_constraint (const std::string&,
- const standard_version& dependent_version);
-
- // Throw std::invalid_argument if the specified version range is invalid.
- //
- standard_version_constraint (
- butl::optional<standard_version> min_version, bool min_open,
- butl::optional<standard_version> max_version, bool max_open);
-
- explicit
- 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;}
-
- bool
- satisfies (const standard_version&) const noexcept;
- };
-
- 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 <libbutl/standard-version.ixx>