forked from VsVim/VsVim
-
Notifications
You must be signed in to change notification settings - Fork 0
/
LineRange.cs
115 lines (96 loc) · 3.23 KB
/
LineRange.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
using System;
using System.Collections.Generic;
using System.Linq;
namespace EditorUtils
{
/// <summary>
/// A simple line range
/// </summary>
public struct LineRange : IEquatable<LineRange>
{
private readonly int _startLine;
private readonly int _count;
public int StartLineNumber
{
get { return _startLine; }
}
public int LastLineNumber
{
get { return _startLine + (_count - 1); }
}
public int Count
{
get { return _count; }
}
public IEnumerable<int> LineNumbers
{
get { return Enumerable.Range(_startLine, _count); }
}
public LineRange(int startLine, int count)
{
_startLine = startLine;
_count = count;
}
public bool ContainsLineNumber(int lineNumber)
{
return lineNumber >= _startLine && lineNumber <= LastLineNumber;
}
public bool Contains(LineRange lineRange)
{
return
StartLineNumber <= lineRange.StartLineNumber &&
LastLineNumber >= lineRange.LastLineNumber;
}
public bool Intersects(LineRange lineRange)
{
return
ContainsLineNumber(lineRange.StartLineNumber) ||
ContainsLineNumber(lineRange.LastLineNumber) ||
LastLineNumber + 1 == lineRange.StartLineNumber ||
StartLineNumber == lineRange.LastLineNumber + 1;
}
public override int GetHashCode()
{
return _startLine ^ _count;
}
public override bool Equals(object obj)
{
if (obj is LineRange)
{
return Equals((LineRange)obj);
}
return false;
}
public bool Equals(LineRange lineRange)
{
return StartLineNumber == lineRange.StartLineNumber && Count == lineRange.Count;
}
public override string ToString()
{
return String.Format("[{0} - {1}]", StartLineNumber, LastLineNumber);
}
public static bool operator ==(LineRange left, LineRange right)
{
return left.Equals(right);
}
public static bool operator !=(LineRange left, LineRange right)
{
return !left.Equals(right);
}
public static LineRange CreateFromBounds(int startLineNumber, int lastLineNumber)
{
if (lastLineNumber < startLineNumber)
{
throw new ArgumentOutOfRangeException("lastLineNumber");
}
var count = (lastLineNumber - startLineNumber) + 1;
return new LineRange(startLineNumber, count);
}
public static LineRange CreateOverarching(LineRange left, LineRange right)
{
var startLineNumber = Math.Min(left.StartLineNumber, right.StartLineNumber);
var lastLineNumber = Math.Max(left.LastLineNumber, right.LastLineNumber);
return CreateFromBounds(startLineNumber, lastLineNumber);
}
}
}