You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

range.go 1.9 kB

10 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package math2
  2. type Range struct {
  3. Offset int64
  4. Length *int64
  5. }
  6. // length为-1时Range.Length为nil
  7. func NewRange(offset int64, length int64) Range {
  8. if length == -1 {
  9. return Range{Offset: offset, Length: nil}
  10. }
  11. return Range{Offset: offset, Length: &length}
  12. }
  13. // 不包含end
  14. func RangeFromStartEnd(start int64, end int64) Range {
  15. length := end - start
  16. return Range{Offset: start, Length: &length}
  17. }
  18. // 给Length设置一个具体值
  19. func (r *Range) Fix(totalLen int64) {
  20. len := totalLen - r.Offset
  21. r.Length = &len
  22. }
  23. // 如果Length为nil,则end为-1
  24. func (r *Range) ToStartEnd() (start int64, end int64) {
  25. if r.Length == nil {
  26. return r.Offset, -1
  27. }
  28. end = r.Offset + *r.Length
  29. return r.Offset, end
  30. }
  31. // 将范围限制在totalLen内。会同时设置Length的值
  32. func (r *Range) Clamp(totalLen int64) {
  33. r.Offset = Min(r.Offset, totalLen)
  34. if r.Length == nil {
  35. len := totalLen - r.Offset
  36. r.Length = &len
  37. } else {
  38. *r.Length = Min(*r.Length, totalLen-r.Offset)
  39. }
  40. }
  41. func (r *Range) Extend(other Range) {
  42. newOffset := Min(r.Offset, other.Offset)
  43. if r.Length == nil {
  44. r.Offset = newOffset
  45. return
  46. }
  47. if other.Length == nil {
  48. r.Offset = newOffset
  49. r.Length = nil
  50. return
  51. }
  52. otherEnd := other.Offset + *other.Length
  53. rEnd := r.Offset + *r.Length
  54. newEnd := Max(otherEnd, rEnd)
  55. r.Offset = newOffset
  56. *r.Length = newEnd - newOffset
  57. }
  58. func (r *Range) ExtendStart(start int64) {
  59. r.Offset = Min(r.Offset, start)
  60. }
  61. func (r *Range) ExtendEnd(end int64) {
  62. if r.Length == nil {
  63. return
  64. }
  65. rEnd := r.Offset + *r.Length
  66. newLen := Max(end, rEnd) - r.Offset
  67. r.Length = &newLen
  68. }
  69. func (r *Range) Equals(other Range) bool {
  70. if r.Offset != other.Offset {
  71. return false
  72. }
  73. if r.Length == nil && other.Length == nil {
  74. return true
  75. }
  76. if r.Length == nil || other.Length == nil {
  77. return false
  78. }
  79. return *r.Length == *other.Length
  80. }