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]); }