aboutsummaryrefslogtreecommitdiff
path: root/bpkg/satisfaction.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2015-10-06 08:43:01 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2015-10-06 08:43:01 +0200
commitfd2c0dc9707714d82580dc61854efc06335e6091 (patch)
tree2ad76b0dad17b244c183405b02fa9138d0407e8d /bpkg/satisfaction.cxx
parenta23e8ac5de6170a4a82a2ac475aff707d5accbf6 (diff)
Track prerequisite packages, handle in pkg-{con,dis}figure
Diffstat (limited to 'bpkg/satisfaction.cxx')
-rw-r--r--bpkg/satisfaction.cxx101
1 files changed, 101 insertions, 0 deletions
diff --git a/bpkg/satisfaction.cxx b/bpkg/satisfaction.cxx
new file mode 100644
index 0000000..0631b83
--- /dev/null
+++ b/bpkg/satisfaction.cxx
@@ -0,0 +1,101 @@
+// file : bpkg/satisfaction.cxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#include <bpkg/satisfaction>
+
+#include <bpkg/package-odb>
+#include <bpkg/diagnostics>
+
+using namespace std;
+using namespace butl;
+
+namespace bpkg
+{
+ bool
+ satisfies (const version& v, const dependency_constraint& c)
+ {
+ using op = comparison;
+
+ // Note that the constraint's version is always rhs (libfoo >= 1.2.3).
+ //
+ switch (c.operation)
+ {
+ case op::eq: return v == c.version;
+ case op::lt: return v < c.version;
+ case op::gt: return v > c.version;
+ case op::le: return v <= c.version;
+ case op::ge: return v >= c.version;
+ }
+
+ assert (false);
+ return false;
+ }
+
+ bool
+ satisfies (const dependency_constraint& l, const dependency_constraint& r)
+ {
+ using op = comparison;
+
+ op lo (l.operation);
+ op ro (r.operation);
+
+ const version& lv (l.version);
+ const version& rv (r.version);
+
+ switch (lo)
+ {
+ case op::eq: // ==
+ {
+ return ro == op::eq && lv == rv;
+ }
+ case op::lt: // <
+ {
+ switch (ro)
+ {
+ case op::eq: return rv < lv;
+ case op::lt: return rv <= lv;
+ case op::le: return rv < lv;
+ case op::gt:
+ case op::ge: return false;
+ }
+ }
+ case op::le: // <=
+ {
+ switch (ro)
+ {
+ case op::eq: return rv <= lv;
+ case op::lt: return rv < lv;
+ case op::le: return rv <= lv;
+ case op::gt:
+ case op::ge: return false;
+ }
+ }
+ case op::gt: // >
+ {
+ switch (ro)
+ {
+ case op::eq: return lv > rv;
+ case op::lt:
+ case op::le: return false;
+ case op::gt: return lv >= rv;
+ case op::ge: return lv > rv;
+ }
+ }
+ case op::ge: // >=
+ {
+ switch (ro)
+ {
+ case op::eq: return lv >= rv;
+ case op::lt:
+ case op::le: return false;
+ case op::gt: return lv > rv;
+ case op::ge: return lv >= rv;
+ }
+ }
+ }
+
+ assert (false);
+ return false;
+ }
+}