Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
5b2837b9
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,发现更多精彩内容 >>
提交
5b2837b9
编写于
5月 20, 2014
作者:
E
Eduard Burtescu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
syntax: document the ptr module.
上级
f8df4fad
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
30 addition
and
1 deletion
+30
-1
src/libsyntax/ptr.rs
src/libsyntax/ptr.rs
+30
-1
未找到文件。
src/libsyntax/ptr.rs
浏览文件 @
5b2837b9
...
...
@@ -8,6 +8,32 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
//! The AST pointer
//!
//! Provides `P<T>`, a frozen owned smart pointer, as a replacement for `@T` in the AST.
//!
//! # Motivations and benefits
//!
//! * **Identity**: sharing AST nodes is problematic for the various analysis passes
//! (e.g. one may be able to bypass the borrow checker with a shared `ExprAddrOf`
//! node taking a mutable borrow). The only reason `@T` in the AST hasn't caused
//! issues is because of inefficient folding passes which would always deduplicate
//! any such shared nodes. Even if the AST were to switch to an arena, this would
//! still hold, i.e. it couldn't use `&'a T`, but rather a wrapper like `P<'a, T>`.
//!
//! * **Immutability**: `P<T>` disallows mutating its inner `T`, unlike `Box<T>`
//! (unless it contains an `Unsafe` interior, but that may be denied later).
//! This mainly prevents mistakes, but can also enforces a kind of "purity".
//!
//! * **Efficiency**: folding can reuse allocation space for `P<T>` and `Vec<T>`,
//! the latter even when the input and output types differ (as it would be the
//! case with arenas or a GADT AST using type parameters to toggle features).
//!
//! * **Maintainability**: `P<T>` provides a fixed interface - `Deref`,
//! `and_then` and `map` - which can remain fully functional even if the
//! implementation changes (using a special thread-local heap, for example).
//! Moreover, a switch to, e.g. `P<'a, T>` would be easy and mostly automated.
use
std
::
fmt
;
use
std
::
fmt
::
Show
;
use
std
::
hash
::
Hash
;
...
...
@@ -19,7 +45,7 @@ pub struct P<T> {
}
#[allow(non_snake_case)]
/// Construct a
P<T> from a T
value.
/// Construct a
`P<T>` from a `T`
value.
pub
fn
P
<
T
:
'static
>
(
value
:
T
)
->
P
<
T
>
{
P
{
ptr
:
box
value
...
...
@@ -27,10 +53,13 @@ pub fn P<T: 'static>(value: T) -> P<T> {
}
impl
<
T
:
'static
>
P
<
T
>
{
/// Move out of the pointer.
/// Intended for chaining transformations not covered by `map`.
pub
fn
and_then
<
U
>
(
self
,
f
:
|
T
|
->
U
)
->
U
{
f
(
*
self
.ptr
)
}
/// Transform the inner value, consuming `self` and producing a new `P<T>`.
pub
fn
map
(
mut
self
,
f
:
|
T
|
->
T
)
->
P
<
T
>
{
use
std
::{
mem
,
ptr
};
unsafe
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录