addr_range.go raw

   1  package state
   2  
   3  // A Range represents a contiguous range of T.
   4  //
   5  // +stateify savable
   6  type addrRange struct {
   7  	// Start is the inclusive start of the range.
   8  	Start uintptr
   9  
  10  	// End is the exclusive end of the range.
  11  	End uintptr
  12  }
  13  
  14  // WellFormed returns true if r.Start <= r.End. All other methods on a Range
  15  // require that the Range is well-formed.
  16  //
  17  //go:nosplit
  18  func (r addrRange) WellFormed() bool {
  19  	return r.Start <= r.End
  20  }
  21  
  22  // Length returns the length of the range.
  23  //
  24  //go:nosplit
  25  func (r addrRange) Length() uintptr {
  26  	return r.End - r.Start
  27  }
  28  
  29  // Contains returns true if r contains x.
  30  //
  31  //go:nosplit
  32  func (r addrRange) Contains(x uintptr) bool {
  33  	return r.Start <= x && x < r.End
  34  }
  35  
  36  // Overlaps returns true if r and r2 overlap.
  37  //
  38  //go:nosplit
  39  func (r addrRange) Overlaps(r2 addrRange) bool {
  40  	return r.Start < r2.End && r2.Start < r.End
  41  }
  42  
  43  // IsSupersetOf returns true if r is a superset of r2; that is, the range r2 is
  44  // contained within r.
  45  //
  46  //go:nosplit
  47  func (r addrRange) IsSupersetOf(r2 addrRange) bool {
  48  	return r.Start <= r2.Start && r.End >= r2.End
  49  }
  50  
  51  // Intersect returns a range consisting of the intersection between r and r2.
  52  // If r and r2 do not overlap, Intersect returns a range with unspecified
  53  // bounds, but for which Length() == 0.
  54  //
  55  //go:nosplit
  56  func (r addrRange) Intersect(r2 addrRange) addrRange {
  57  	if r.Start < r2.Start {
  58  		r.Start = r2.Start
  59  	}
  60  	if r.End > r2.End {
  61  		r.End = r2.End
  62  	}
  63  	if r.End < r.Start {
  64  		r.End = r.Start
  65  	}
  66  	return r
  67  }
  68  
  69  // CanSplitAt returns true if it is legal to split a segment spanning the range
  70  // r at x; that is, splitting at x would produce two ranges, both of which have
  71  // non-zero length.
  72  //
  73  //go:nosplit
  74  func (r addrRange) CanSplitAt(x uintptr) bool {
  75  	return r.Contains(x) && r.Start < x
  76  }
  77