package math2 type Range struct { Offset int64 Length *int64 } // length为-1时Range.Length为nil func NewRange(offset int64, length int64) Range { if length == -1 { return Range{Offset: offset, Length: nil} } return Range{Offset: offset, Length: &length} } // 不包含end func RangeFromStartEnd(start int64, end int64) Range { length := end - start return Range{Offset: start, Length: &length} } // 给Length设置一个具体值 func (r *Range) Fix(totalLen int64) { len := totalLen - r.Offset r.Length = &len } // 如果Length为nil,则end为-1 func (r *Range) ToStartEnd() (start int64, end int64) { if r.Length == nil { return r.Offset, -1 } end = r.Offset + *r.Length return r.Offset, end } // 将范围限制在totalLen内。会同时设置Length的值 func (r *Range) Clamp(totalLen int64) { r.Offset = Min(r.Offset, totalLen) if r.Length == nil { len := totalLen - r.Offset r.Length = &len } else { *r.Length = Min(*r.Length, totalLen-r.Offset) } } func (r *Range) Extend(other Range) { newOffset := Min(r.Offset, other.Offset) if r.Length == nil { r.Offset = newOffset return } if other.Length == nil { r.Offset = newOffset r.Length = nil return } otherEnd := other.Offset + *other.Length rEnd := r.Offset + *r.Length newEnd := Max(otherEnd, rEnd) r.Offset = newOffset *r.Length = newEnd - newOffset } func (r *Range) ExtendStart(start int64) { r.Offset = Min(r.Offset, start) } func (r *Range) ExtendEnd(end int64) { if r.Length == nil { return } rEnd := r.Offset + *r.Length newLen := Max(end, rEnd) - r.Offset r.Length = &newLen } func (r *Range) Equals(other Range) bool { if r.Offset != other.Offset { return false } if r.Length == nil && other.Length == nil { return true } if r.Length == nil || other.Length == nil { return false } return *r.Length == *other.Length }