mirror of
https://github.com/servo/servo.git
synced 2025-06-25 17:44:33 +01:00
Move Range::relation_to_range
This commit is contained in:
parent
0562871cc7
commit
a706a57f32
1 changed files with 48 additions and 53 deletions
|
@ -52,55 +52,6 @@ pub impl Range {
|
||||||
pub pure fn adjust_by(off_i: int, len_i: int) -> Range {
|
pub pure fn adjust_by(off_i: int, len_i: int) -> Range {
|
||||||
Range(((self.off as int) + off_i) as uint, ((self.len as int) + len_i) as uint)
|
Range(((self.off as int) + off_i) as uint, ((self.len as int) + len_i) as uint)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Computes the relationship between two ranges (`self` and `other`),
|
|
||||||
/// from the point of view of `self`. So, 'EntirelyBefore' means
|
|
||||||
/// that the `self` range is entirely before `other` range.
|
|
||||||
fn relation_to_range(&self, other: Range) -> RangeRelation {
|
|
||||||
if other.begin() > self.end() {
|
|
||||||
return EntirelyBefore;
|
|
||||||
}
|
|
||||||
if self.begin() > other.end() {
|
|
||||||
return EntirelyAfter;
|
|
||||||
}
|
|
||||||
if self.begin() == other.begin() && self.end() == other.end() {
|
|
||||||
return Coincides;
|
|
||||||
}
|
|
||||||
if self.begin() <= other.begin() && self.end() >= other.end() {
|
|
||||||
return Contains;
|
|
||||||
}
|
|
||||||
if self.begin() >= other.begin() && self.end() <= other.end() {
|
|
||||||
return ContainedBy;
|
|
||||||
}
|
|
||||||
if self.begin() < other.begin() && self.end() < other.end() {
|
|
||||||
let overlap = self.end() - other.begin();
|
|
||||||
return OverlapsBegin(overlap);
|
|
||||||
}
|
|
||||||
if self.begin() > other.begin() && self.end() > other.end() {
|
|
||||||
let overlap = other.end() - self.begin();
|
|
||||||
return OverlapsEnd(overlap);
|
|
||||||
}
|
|
||||||
fail fmt!("relation_to_range(): didn't classify self=%?, other=%?",
|
|
||||||
self, other);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn repair_after_coalesced_range(&self, other: Range) -> Range {
|
|
||||||
let relation = self.relation_to_range(other);
|
|
||||||
debug!("repair_after_coalesced_range: possibly repairing range %?", self);
|
|
||||||
debug!("repair_after_coalesced_range: relation of original range and coalesced range(%?): %?",
|
|
||||||
other, relation);
|
|
||||||
let new_range = match relation {
|
|
||||||
EntirelyBefore => { *self },
|
|
||||||
EntirelyAfter => { self.shift_by(-(other.length() as int)) },
|
|
||||||
Coincides | ContainedBy => { Range(other.begin(), 1) },
|
|
||||||
Contains => { self.extend_by(-(other.length() as int)) },
|
|
||||||
OverlapsBegin(overlap) => { self.extend_by(1 - (overlap as int)) },
|
|
||||||
OverlapsEnd(overlap) =>
|
|
||||||
{ Range(other.begin(), self.length() - overlap + 1) }
|
|
||||||
};
|
|
||||||
debug!("repair_after_coalesced_range: new range: ---- %?", new_range);
|
|
||||||
new_range
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub pure fn empty_mut() -> MutableRange { MutableRange::new(0, 0) }
|
pub pure fn empty_mut() -> MutableRange { MutableRange::new(0, 0) }
|
||||||
|
@ -132,10 +83,6 @@ pub impl MutableRange {
|
||||||
i >= self.begin() && i < self.end()
|
i >= self.begin() && i < self.end()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn relation_to_range(&const self, other: &MutableRange) -> RangeRelation {
|
|
||||||
self.as_immutable().relation_to_range(other.as_immutable())
|
|
||||||
}
|
|
||||||
|
|
||||||
pure fn as_immutable(&const self) -> Range {
|
pure fn as_immutable(&const self) -> Range {
|
||||||
Range(self.begin(), self.length())
|
Range(self.begin(), self.length())
|
||||||
}
|
}
|
||||||
|
@ -165,4 +112,52 @@ pub impl MutableRange {
|
||||||
self.off = off_i;
|
self.off = off_i;
|
||||||
self.len = len_i;
|
self.len = len_i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Computes the relationship between two ranges (`self` and `other`),
|
||||||
|
/// from the point of view of `self`. So, 'EntirelyBefore' means
|
||||||
|
/// that the `self` range is entirely before `other` range.
|
||||||
|
pure fn relation_to_range(&const self, other: &const MutableRange) -> RangeRelation {
|
||||||
|
if other.begin() > self.end() {
|
||||||
|
return EntirelyBefore;
|
||||||
|
}
|
||||||
|
if self.begin() > other.end() {
|
||||||
|
return EntirelyAfter;
|
||||||
|
}
|
||||||
|
if self.begin() == other.begin() && self.end() == other.end() {
|
||||||
|
return Coincides;
|
||||||
|
}
|
||||||
|
if self.begin() <= other.begin() && self.end() >= other.end() {
|
||||||
|
return Contains;
|
||||||
|
}
|
||||||
|
if self.begin() >= other.begin() && self.end() <= other.end() {
|
||||||
|
return ContainedBy;
|
||||||
|
}
|
||||||
|
if self.begin() < other.begin() && self.end() < other.end() {
|
||||||
|
let overlap = self.end() - other.begin();
|
||||||
|
return OverlapsBegin(overlap);
|
||||||
|
}
|
||||||
|
if self.begin() > other.begin() && self.end() > other.end() {
|
||||||
|
let overlap = other.end() - self.begin();
|
||||||
|
return OverlapsEnd(overlap);
|
||||||
|
}
|
||||||
|
fail fmt!("relation_to_range(): didn't classify self=%?, other=%?",
|
||||||
|
self, other);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn repair_after_coalesced_range(&mut self, other: &const MutableRange) {
|
||||||
|
let relation = self.relation_to_range(other);
|
||||||
|
debug!("repair_after_coalesced_range: possibly repairing range %?", self);
|
||||||
|
debug!("repair_after_coalesced_range: relation of original range and coalesced range(%?): %?",
|
||||||
|
other, relation);
|
||||||
|
match relation {
|
||||||
|
EntirelyBefore => { },
|
||||||
|
EntirelyAfter => { self.shift_by(-(other.length() as int)); },
|
||||||
|
Coincides | ContainedBy => { self.reset(other.begin(), 1); },
|
||||||
|
Contains => { self.extend_by(-(other.length() as int)); },
|
||||||
|
OverlapsBegin(overlap) => { self.extend_by(1 - (overlap as int)); },
|
||||||
|
OverlapsEnd(overlap) =>
|
||||||
|
{ self.reset(other.begin(), self.length() - overlap + 1); }
|
||||||
|
};
|
||||||
|
debug!("repair_after_coalesced_range: new range: ---- %?", self);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue