Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
683bdc7f
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,发现更多精彩内容 >>
提交
683bdc7f
编写于
3月 04, 2018
作者:
S
Shotaro Yamada
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add comments
上级
08504fbb
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
40 addition
and
20 deletion
+40
-20
src/liballoc/str.rs
src/liballoc/str.rs
+40
-20
未找到文件。
src/liballoc/str.rs
浏览文件 @
683bdc7f
...
...
@@ -2071,35 +2071,55 @@ pub fn repeat(&self, n: usize) -> String {
return
String
::
new
();
}
// n = 2^j + k (2^j > k)
// If `n` is larger than zero, it can be split as
// `n = 2^expn + rem (2^expn > rem, expn >= 0, rem >= 0)`.
// `2^expn` is the number represented by the leftmost '1' bit of `n`,
// and `rem` is the remaining part of `n`.
// 2^j:
let
mut
s
=
Vec
::
with_capacity
(
self
.len
()
*
n
);
s
.extend
(
self
.as_bytes
());
// Using `Vec` to access `set_len()`.
let
mut
buf
=
Vec
::
with_capacity
(
self
.len
()
*
n
);
// `2^expn` repetition is done by doubling `buf` `expn`-times.
buf
.extend
(
self
.as_bytes
());
{
let
mut
m
=
n
>>
1
;
// If `m > 0`, there are remaining bits up to the leftmost '1'.
while
m
>
0
{
let
len
=
s
.len
();
// `buf.extend(buf)`:
unsafe
{
ptr
::
copy_nonoverlapping
(
s
.as_ptr
(),
(
s
.as_mut_ptr
()
as
*
mut
u8
)
.add
(
len
),
len
);
s
.set_len
(
len
*
2
);
ptr
::
copy_nonoverlapping
(
buf
.as_ptr
(),
(
buf
.as_mut_ptr
()
as
*
mut
u8
)
.add
(
buf
.len
()),
buf
.len
(),
);
// `buf` has capacity of `self.len() * n`.
let
buf_len
=
buf
.len
();
buf
.set_len
(
buf_len
*
2
);
}
m
>>=
1
;
}
}
// k:
let
res_len
=
n
*
self
.len
();
if
res_len
>
s
.len
()
{
// `rem` (`= n - 2^expn`) repetition is done by copying
// first `rem` repetitions from `buf` itself.
let
rem_len
=
self
.len
()
*
n
-
buf
.len
();
// `self.len() * rem`
if
rem_len
>
0
{
// `buf.extend(buf[0 .. rem_len])`:
unsafe
{
// This is non-overlapping since `2^expn > rem`.
ptr
::
copy_nonoverlapping
(
s
.as_ptr
(),
(
s
.as_mut_ptr
()
as
*
mut
u8
)
.add
(
s
.len
()),
re
s_len
-
s
.len
()
,
buf
.as_ptr
(),
(
buf
.as_mut_ptr
()
as
*
mut
u8
)
.add
(
buf
.len
()),
re
m_len
,
);
s
.set_len
(
res_len
);
// `buf.len() + rem_len` equals to `buf.capacity()` (`self.len() * n`).
let
buf_len
=
buf
.len
();
buf
.set_len
(
buf_len
+
rem_len
);
}
}
unsafe
{
String
::
from_utf8_unchecked
(
s
)
}
unsafe
{
String
::
from_utf8_unchecked
(
buf
)
}
}
/// Checks if all characters in this string are within the ASCII range.
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录