Synced up common/values.cpp and v1/values.cpp.

Includes two patches made on common/values.cpp:

1) https://reviews.apache.org/r/45813/
   Removed capture by reference.
2) https://reviews.apache.org/r/48593/
   Refactor Value::Ranges subtraction.

Review: https://reviews.apache.org/r/50138/


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/2608199d
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/2608199d
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/2608199d

Branch: refs/heads/master
Commit: 2608199df6d939a9848a777f022d1aa9e50c5286
Parents: fd89c07
Author: Guangya Liu <gyliu...@gmail.com>
Authored: Mon Jul 18 13:13:42 2016 -0700
Committer: Joseph Wu <josep...@apache.org>
Committed: Mon Jul 18 13:44:35 2016 -0700

----------------------------------------------------------------------
 src/v1/values.cpp | 73 +++++++++++++++++++++-----------------------------
 1 file changed, 31 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/2608199d/src/v1/values.cpp
----------------------------------------------------------------------
diff --git a/src/v1/values.cpp b/src/v1/values.cpp
index 3e0f739..ff1926f 100644
--- a/src/v1/values.cpp
+++ b/src/v1/values.cpp
@@ -33,6 +33,7 @@
 
 #include <stout/error.hpp>
 #include <stout/foreach.hpp>
+#include <stout/interval.hpp>
 #include <stout/strings.hpp>
 
 using std::max;
@@ -267,46 +268,32 @@ void coalesce(Value::Ranges* result, const Value::Range& 
addedRange)
 }
 
 
-// Removes a range from already coalesced ranges.
-// The algorithms constructs a new vector of ranges which is then
-// coalesced into a Value::Ranges instance.
-static void remove(Value::Ranges* _ranges, const Value::Range& removal)
+// Convert Ranges value to IntervalSet value.
+IntervalSet<uint64_t> rangesToIntervalSet(const Value::Ranges& ranges)
 {
-  vector<internal::Range> ranges;
-  ranges.reserve(_ranges->range_size());
+  IntervalSet<uint64_t> set;
 
-  foreach (const Value::Range& range, _ranges->range()) {
-    // Skip if the entire range is subsumed by `removal`.
-    if (range.begin() >= removal.begin() && range.end() <= removal.end()) {
-      continue;
-    }
+  foreach (const Value::Range& range, ranges.range()) {
+    set += (Bound<uint64_t>::closed(range.begin()),
+            Bound<uint64_t>::closed(range.end()));
+  }
 
-    // Divide if the range subsumes the `removal`.
-    if (range.begin() < removal.begin() && range.end() > removal.end()) {
-      // Front.
-      ranges.emplace_back(internal::Range{range.begin(), removal.begin() - 1});
-      // Back.
-      ranges.emplace_back(internal::Range{removal.end() + 1, range.end()});
-    }
+  return set;
+}
 
-    // Fully Emplace if the range doesn't intersect.
-    if (range.end() < removal.begin() || range.begin() > removal.end()) {
-      ranges.emplace_back(internal::Range{range.begin(), range.end()});
-    } else {
-      // Trim if the range does intersect.
-      if (range.end() > removal.end()) {
-        // Trim front.
-        ranges.emplace_back(internal::Range{removal.end() + 1, range.end()});
-      } else {
-        // Trim back.
-        CHECK(range.begin() < removal.begin());
-        ranges.emplace_back(
-            internal::Range{range.begin(), removal.begin() - 1});
-      }
-    }
+
+// Convert IntervalSet value to Ranges value.
+Value::Ranges intervalSetToRanges(const IntervalSet<uint64_t>& set)
+{
+  Value::Ranges ranges;
+
+  foreach (const Interval<uint64_t>& interval, set) {
+    Value::Range* range = ranges.add_range();
+    range->set_begin(interval.lower());
+    range->set_end(interval.upper() - 1);
   }
 
-  internal::coalesce(_ranges, std::move(ranges));
+  return ranges;
 }
 
 
@@ -406,13 +393,15 @@ Value::Ranges& operator+=(Value::Ranges& left, const 
Value::Ranges& right)
 }
 
 
-Value::Ranges& operator-=(Value::Ranges& left, const Value::Ranges& right)
+Value::Ranges& operator-=(Value::Ranges& _left, const Value::Ranges& _right)
 {
-  coalesce(&left);
-  for (int i = 0; i < right.range_size(); ++i) {
-    remove(&left, right.range(i));
-  }
-  return left;
+  IntervalSet<uint64_t> left, right;
+
+  left = rangesToIntervalSet(_left);
+  right = rangesToIntervalSet(_right);
+  _left = intervalSetToRanges(left - right);
+
+  return _left;
 }
 
 
@@ -610,7 +599,7 @@ Try<Value> parse(const string& text)
     // This is a Value::Ranges.
     value.set_type(Value::RANGES);
     Value::Ranges* ranges = value.mutable_ranges();
-    const vector<string>& tokens = strings::tokenize(temp, "[]-,\n");
+    const vector<string> tokens = strings::tokenize(temp, "[]-,\n");
     if (tokens.size() % 2 != 0) {
       return Error("Expecting one or more \"ranges\"");
     } else {
@@ -637,7 +626,7 @@ Try<Value> parse(const string& text)
       // This is a set.
       value.set_type(Value::SET);
       Value::Set* set = value.mutable_set();
-      const vector<string>& tokens = strings::tokenize(temp, "{},\n");
+      const vector<string> tokens = strings::tokenize(temp, "{},\n");
       for (size_t i = 0; i < tokens.size(); i++) {
         set->add_item(tokens[i]);
       }

Reply via email to