RangeMapping.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. namespace Day5;
  2. public record RangeMapping(long SrcIndex, long DstIndex, long Length)
  3. {
  4. public static RangeMapping Identity { get; } = new RangeMapping(0, 0, long.MaxValue);
  5. public bool IsMatch(long value)
  6. {
  7. return SrcIndex <= value && value < SrcIndex + Length;
  8. }
  9. public bool IsOverlap(Range range)
  10. {
  11. return range.Start < SrcIndex + Length && range.Start + range.Length > SrcIndex;
  12. }
  13. public bool IsWithin(Range range)
  14. {
  15. return range.Start >= SrcIndex && range.Start + range.Length <= SrcIndex + Length;
  16. }
  17. public IEnumerable<Range> Split(Range range)
  18. {
  19. if (range.Start >= SrcIndex + Length || range.Start + range.Length < SrcIndex)
  20. {
  21. throw new ArgumentException("Not overlapping");
  22. }
  23. if (range.Start >= SrcIndex && range.Start + range.Length < SrcIndex + Length)
  24. {
  25. throw new ArgumentException("Already within");
  26. }
  27. if (range.Start < SrcIndex)
  28. {
  29. yield return new Range(range.Start, SrcIndex - range.Start);
  30. }
  31. if (range.Start + range.Length > SrcIndex + Length)
  32. {
  33. yield return new Range(SrcIndex + Length, (range.Start + range.Length) - (SrcIndex + Length));
  34. }
  35. var left = Math.Max(SrcIndex, range.Start);
  36. var right = Math.Min(SrcIndex + Length, range.Start + range.Length);
  37. yield return new Range(SrcIndex + (left - SrcIndex), right - left);
  38. }
  39. public long Transform(long value)
  40. {
  41. return DstIndex + (value - SrcIndex);
  42. }
  43. public Range Transform(Range range)
  44. {
  45. if (!IsWithin(range))
  46. {
  47. throw new ArgumentException("Not in range");
  48. }
  49. var left = Math.Max(SrcIndex, range.Start);
  50. var right = Math.Min(SrcIndex + Length, range.Start + range.Length);
  51. return new Range(DstIndex + (left - SrcIndex), right - left);
  52. }
  53. }