Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
31c180e5
R
Rust
项目概览
int
/
Rust
大约 1 年 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
31c180e5
编写于
7月 17, 2013
作者:
G
Graydon Hoare
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
extra: clean up workcache to use & in place of @ most places.
上级
1d9181bd
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
71 addition
and
58 deletion
+71
-58
src/libextra/workcache.rs
src/libextra/workcache.rs
+71
-58
未找到文件。
src/libextra/workcache.rs
浏览文件 @
31c180e5
...
...
@@ -124,6 +124,15 @@ struct Database {
}
impl
Database
{
pub
fn
new
(
p
:
Path
)
->
Database
{
Database
{
db_filename
:
p
,
db_cache
:
TreeMap
::
new
(),
db_dirty
:
false
}
}
pub
fn
prepare
(
&
self
,
fn_name
:
&
str
,
declared_inputs
:
&
WorkMap
)
...
...
@@ -156,6 +165,11 @@ struct Logger {
}
impl
Logger
{
pub
fn
new
()
->
Logger
{
Logger
{
a
:
()
}
}
pub
fn
info
(
&
self
,
i
:
&
str
)
{
io
::
println
(
~
"workcache: "
+
i
);
}
...
...
@@ -163,15 +177,14 @@ pub fn info(&self, i: &str) {
struct
Context
{
db
:
RWARC
<
Database
>
,
logger
:
@
mut
Logger
,
logger
:
Logger
,
cfg
:
json
::
Object
,
freshness
:
TreeMap
<~
str
,
@
fn
(
&
str
,
&
str
)
->
bool
>
}
#[deriving(Clone)]
struct
Prep
{
ctxt
:
@
Context
,
fn_name
:
~
str
,
struct
Prep
<
'self
>
{
ctxt
:
&
'self
Context
,
fn_name
:
&
'self
str
,
declared_inputs
:
WorkMap
,
}
...
...
@@ -180,8 +193,8 @@ struct Exec {
discovered_outputs
:
WorkMap
}
struct
Work
<
T
>
{
prep
:
@
mut
Prep
,
struct
Work
<
'self
,
T
>
{
prep
:
&
'self
Prep
<
'self
>
,
res
:
Option
<
Either
<
T
,
PortOne
<
(
Exec
,
T
)
>>>
}
...
...
@@ -215,8 +228,8 @@ fn digest_file(path: &Path) -> ~str {
}
impl
Context
{
pub
fn
new
(
db
:
RWARC
<
Database
>
,
lg
:
@
mut
Logger
,
cfg
:
json
::
Object
)
->
Context
{
pub
fn
new
(
db
:
RWARC
<
Database
>
,
lg
:
Logger
,
cfg
:
json
::
Object
)
->
Context
{
Context
{
db
:
db
,
logger
:
lg
,
...
...
@@ -225,33 +238,28 @@ pub fn new(db: RWARC<Database>, lg: @mut Logger, cfg: json::Object)
}
}
pub
fn
prep
<
T
:
Send
+
Encodable
<
json
::
Encoder
>
+
Decodable
<
json
::
Decoder
>>
(
@
self
,
// FIXME(#5121)
fn_name
:
&
str
,
blk
:
&
fn
(
@
mut
Prep
)
->
Work
<
T
>
)
->
Work
<
T
>
{
let
p
=
@
mut
Prep
{
ctxt
:
self
,
fn_name
:
fn_name
.to_owned
(),
declared_inputs
:
WorkMap
::
new
()
};
blk
(
p
)
pub
fn
prep
<
'a
>
(
&
'a
self
,
fn_name
:
&
'a
str
)
->
Prep
<
'a
>
{
Prep
::
new
(
self
,
fn_name
)
}
}
pub
fn
with_prep
<
'a
,
T
>
(
&
'a
self
,
fn_name
:
&
'a
str
,
blk
:
&
fn
(
p
:
&
mut
Prep
)
->
T
)
->
T
{
let
mut
p
=
self
.prep
(
fn_name
);
blk
(
&
mut
p
)
}
trait
TPrep
{
fn
declare_input
(
&
mut
self
,
kind
:
&
str
,
name
:
&
str
,
val
:
&
str
);
fn
is_fresh
(
&
self
,
cat
:
&
str
,
kind
:
&
str
,
name
:
&
str
,
val
:
&
str
)
->
bool
;
fn
all_fresh
(
&
self
,
cat
:
&
str
,
map
:
&
WorkMap
)
->
bool
;
fn
exec
<
T
:
Send
+
Encodable
<
json
::
Encoder
>
+
Decodable
<
json
::
Decoder
>>
(
// FIXME(#5121)
&
self
,
blk
:
~
fn
(
&
Exec
)
->
T
)
->
Work
<
T
>
;
}
impl
TPrep
for
Prep
{
impl
<
'self
>
Prep
<
'self
>
{
fn
new
(
ctxt
:
&
'self
Context
,
fn_name
:
&
'self
str
)
->
Prep
<
'self
>
{
Prep
{
ctxt
:
ctxt
,
fn_name
:
fn_name
,
declared_inputs
:
WorkMap
::
new
()
}
}
}
impl
<
'self
>
Prep
<
'self
>
{
fn
declare_input
(
&
mut
self
,
kind
:
&
str
,
name
:
&
str
,
val
:
&
str
)
{
self
.declared_inputs
.insert
(
WorkKey
::
new
(
kind
,
name
),
val
.to_owned
());
...
...
@@ -286,22 +294,28 @@ fn all_fresh(&self, cat: &str, map: &WorkMap) -> bool {
}
fn
exec
<
T
:
Send
+
Encodable
<
json
::
Encoder
>
+
Decodable
<
json
::
Decoder
>>
(
// FIXME(#5121)
&
self
,
blk
:
~
fn
(
&
Exec
)
->
T
)
->
Work
<
T
>
{
Encodable
<
json
::
Encoder
>
+
Decodable
<
json
::
Decoder
>>
(
&
'self
self
,
blk
:
~
fn
(
&
Exec
)
->
T
)
->
T
{
self
.exec_work
(
blk
)
.unwrap
()
}
fn
exec_work
<
T
:
Send
+
Encodable
<
json
::
Encoder
>
+
Decodable
<
json
::
Decoder
>>
(
// FIXME(#5121)
&
'self
self
,
blk
:
~
fn
(
&
Exec
)
->
T
)
->
Work
<
'self
,
T
>
{
let
mut
bo
=
Some
(
blk
);
let
cached
=
do
self
.ctxt.db.read
|
db
|
{
db
.prepare
(
self
.fn_name
,
&
self
.declared_inputs
)
};
match
cached
{
let
res
=
match
cached
{
Some
((
ref
disc_in
,
ref
disc_out
,
ref
res
))
if
self
.all_fresh
(
"declared input"
,
&
self
.declared_inputs
)
&&
self
.all_fresh
(
"discovered input"
,
disc_in
)
&&
self
.all_fresh
(
"discovered output"
,
disc_out
)
=>
{
Work
::
new
(
@
mut
(
*
self
)
.clone
(),
Left
(
json_decode
(
*
res
)))
if
self
.all_fresh
(
"declared input"
,
&
self
.declared_inputs
)
&&
self
.all_fresh
(
"discovered input"
,
disc_in
)
&&
self
.all_fresh
(
"discovered output"
,
disc_out
)
=>
{
Left
(
json_decode
(
*
res
))
}
_
=>
{
...
...
@@ -318,16 +332,19 @@ fn exec<T:Send +
let
v
=
blk
(
&
exe
);
send_one
(
chan
,
(
exe
,
v
));
}
Work
::
new
(
@
mut
(
*
self
)
.clone
(),
Right
(
port
)
)
Right
(
port
)
}
}
};
Work
::
new
(
self
,
res
)
}
}
impl
<
T
:
Send
+
impl
<
'self
,
T
:
Send
+
Encodable
<
json
::
Encoder
>
+
Decodable
<
json
::
Decoder
>>
Work
<
T
>
{
// FIXME(#5121)
pub
fn
new
(
p
:
@
mut
Prep
,
e
:
Either
<
T
,
PortOne
<
(
Exec
,
T
)
>>
)
->
Work
<
T
>
{
Decodable
<
json
::
Decoder
>>
Work
<
'self
,
T
>
{
// FIXME(#5121)
pub
fn
new
(
p
:
&
'self
Prep
<
'self
>
,
e
:
Either
<
T
,
PortOne
<
(
Exec
,
T
)
>>
)
->
Work
<
'self
,
T
>
{
Work
{
prep
:
p
,
res
:
Some
(
e
)
}
}
...
...
@@ -357,19 +374,16 @@ pub fn unwrap(self) -> T {
fn
test
()
{
use
std
::
io
::
WriterUtil
;
let
db
=
RWARC
(
Database
{
db_filename
:
Path
(
"db.json"
),
db_cache
:
TreeMap
::
new
(),
db_dirty
:
false
});
let
lg
=
@
mut
Logger
{
a
:
()
};
let
cfg
=
HashMap
::
new
();
let
cx
=
@
Context
::
new
(
db
,
lg
,
cfg
);
let
w
:
Work
<~
str
>
=
do
cx
.prep
(
"test1"
)
|
prep
|
{
let
pth
=
Path
(
"foo.c"
);
{
let
file
=
io
::
file_writer
(
&
pth
,
[
io
::
Create
])
.unwrap
();
file
.write_str
(
"int main() { return 0; }"
);
}
let
pth
=
Path
(
"foo.c"
);
{
let
r
=
io
::
file_writer
(
&
pth
,
[
io
::
Create
]);
r
.get_ref
()
.write_str
(
"int main() { return 0; }"
);
}
let
cx
=
Context
::
new
(
RWARC
(
Database
::
new
(
Path
(
"db.json"
))),
Logger
::
new
(),
HashMap
::
new
());
let
s
=
do
cx
.with_prep
(
"test1"
)
|
prep
|
{
prep
.declare_input
(
"file"
,
pth
.to_str
(),
digest_file
(
&
pth
));
do
prep
.exec
|
_
exe
|
{
let
out
=
Path
(
"foo.o"
);
...
...
@@ -377,6 +391,5 @@ fn test() {
out
.to_str
()
}
};
let
s
=
w
.unwrap
();
io
::
println
(
s
);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录