Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
a49345ad
R
roslyn
项目概览
lwm1986
/
roslyn
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
roslyn
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a49345ad
编写于
7月 06, 2015
作者:
C
Cyrus Najmabadi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
revert to original way of traversing the tree.
上级
e281bac3
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
15 addition
and
21 deletion
+15
-21
src/Workspaces/Core/Portable/Shared/Collections/IntervalTree`1.cs
...spaces/Core/Portable/Shared/Collections/IntervalTree`1.cs
+15
-21
未找到文件。
src/Workspaces/Core/Portable/Shared/Collections/IntervalTree`1.cs
浏览文件 @
a49345ad
...
...
@@ -118,7 +118,7 @@ private IEnumerable<T> GetInOrderIntervals(int start, int length, TestInterval t
yield
break
;
}
var
span
=
new
TextSpan
(
start
,
length
)
;
var
end
=
start
+
length
;
// The bool indicates if this is the first time we are seeing the node.
var
candidates
=
new
Stack
<
ValueTuple
<
Node
,
bool
>>();
...
...
@@ -148,37 +148,31 @@ private IEnumerable<T> GetInOrderIntervals(int start, int length, TestInterval t
// time we mark the current node with 'false' to indicate that it's the
// second time we're seeing it the next time it comes around.
//
Only bother descending down the left or right side if that side at least
//
intersects with the span we're curious about. If it doens't intersect then
// i
t can't intersect/overlap/contain the span in question.
if
(
MaxSpanIntersectsWith
(
currentNode
.
Right
,
span
,
introspector
)
)
//
right children's starts will never be to the left of the parent's start
//
so we should consider right subtree only if root's start overlaps with
// i
nterval's End,
if
(
introspector
.
GetStart
(
currentNode
.
Value
)
<=
end
)
{
candidates
.
Push
(
ValueTuple
.
Create
(
currentNode
.
Right
,
true
));
var
right
=
currentNode
.
Right
;
if
(
right
!=
null
&&
GetEnd
(
right
.
MaxEndNode
.
Value
,
introspector
)
>=
start
)
{
candidates
.
Push
(
ValueTuple
.
Create
(
right
,
true
));
}
}
candidates
.
Push
(
ValueTuple
.
Create
(
currentNode
,
false
));
if
(
MaxSpanIntersectsWith
(
currentNode
.
Left
,
span
,
introspector
))
// only if left's maxVal overlaps with interval's start, we should consider
// left subtree
var
left
=
currentNode
.
Left
;
if
(
left
!=
null
&&
GetEnd
(
left
.
MaxEndNode
.
Value
,
introspector
)
>=
start
)
{
candidates
.
Push
(
ValueTuple
.
Create
(
currentNode
.
L
eft
,
true
));
candidates
.
Push
(
ValueTuple
.
Create
(
l
eft
,
true
));
}
}
}
}
private
static
bool
MaxSpanIntersectsWith
(
Node
node
,
TextSpan
span
,
IIntervalIntrospector
<
T
>
introspector
)
{
if
(
node
==
null
)
{
return
false
;
}
var
start
=
introspector
.
GetStart
(
node
.
Value
);
var
end
=
GetEnd
(
node
.
MaxEndNode
.
Value
,
introspector
);
return
span
.
IntersectsWith
(
new
TextSpan
(
start
,
end
));
}
public
IntervalTree
<
T
>
AddInterval
(
T
value
,
IIntervalIntrospector
<
T
>
introspector
)
{
var
newNode
=
new
Node
(
introspector
,
value
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录