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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
// 文件写入源的按需脱离能力。
//
// 轮询式后端通常只需要在 Future 生命周期内借用待写字节;完成式或只接受
// owned buffer 的后端则可能要求数据脱离调用方借用期并独立存活。本模块为
// 两类实现提供同一个公共语义接缝:能借用时直接使用连续只读视图,确实
// 需要独立所有权时才移动、共享或复制。
//
// 这里的“脱离”(detach)不是传统写时复制。文件写入不会修改输入;转换
// 的触发条件是后端所有权与生命周期要求。owned allocation 可以直接移动,
// 引用计数载体可以共享,只有无法独立存活的借用值才需要复制字节。
//
// 常用标准库与 `bytes` 类型具有真实、可调用的脱离和恢复行为;文件 I/O
// 只依赖本 trait 的合同,不依赖这些具体类型的私有表示。
use RawResult;
use crateBufferFailure;
// 可以为文件写入按需产生独立载体的连续字节缓冲区。
//
// # 使用位置
//
// 本 trait 共同约束 `FileIo` 严格尾部追加和全文件原地覆盖方法的写入源。
// 它不用于固定读取目标、增长型读取承载体、MMAP 映射句柄内的范围写入、
// 目录项、元信息、监控事件、后端缓存或向量化 I/O。本版不声明顺序写入或
// 任意偏移随机写入。
//
// 轮询式 adapter 可以只调用 [`AsRef::as_ref`],借用本次标量写入的完整、
// 连续、已初始化权威视图。完成式或 owned-only adapter 才会使用后续关联
// 类型与方法取得独立载体。
//
// 只读映射句柄可以作为不同文件的普通写入源:脱离时移动句柄或增加一次
// 共享引用计数,不需要先把映射字节复制到新的用户态 buffer。目标文件自身的
// 活动映射及从该映射派生的任何视图必须在脱离、复制或文件副作用前拒绝;
// 本 trait 只提供 buffer 能力,不能单独证明源和目标是不同的稳定文件身份。
//
// # `AsRef<[u8]>` 的项目合同
//
// `as_ref()` 返回的切片覆盖本次调用的全部待写字节,从逻辑索引零开始,不
// 含隐藏游标。取得视图不得推进状态、修改内容、分配新字节存储或执行 I/O;
// 同一次操作在脱离前重复取得视图时,长度和内容必须一致。空视图合法。
//
// 本 trait 不继承 `AsMut<[u8]>`、`Borrow<[u8]>`、`bytes::Buf` 或
// `bytes::BufMut`。当前合同只表示单段连续标量输入;离散片段必须由未来独立
// 向量化接口建模。
//
// # 线程、生命周期与对象安全
//
// trait 本身不要求 `Send`、`Sync` 或 `'static`。需要跨线程迁移的具体
// `FileIo` 方法会要求 `B: Send + 'a`;因此当 `B = &'a T` 时,Rust 会通过
// 引用的自动 trait 规则自然要求 `T: Sync`,而 owned buffer 不会被无条件
// 强加 `Sync`。
//
// `Sized` 表示后续脱离操作能够按值消费外层 `B`。`&[u8]` 等胖指针自身仍
// 是有固定大小的值,因此可以实现本 trait。第一版只服务静态泛型核心,
// 不承诺 `dyn DetachableWriteBuffer` 或其它对象安全表面。
//
// # 实现开放性与安全边界
//
// 本 trait 公开且不封闭,第三方可以为池化缓冲区、注册内存或业务载体提供
// 实现。它是安全 trait:违反视图、脱离成本或恢复身份合同属于实现缺陷,
// 但 adapter 不得仅凭本 trait 跳过自身裸指针、初始化、地址稳定与取消安全
// 验证。实现者不能利用它扩大后端可访问范围或伪造已初始化内存。
/// 可按需产生独立载体并在普通失败时恢复原值的连续写入缓冲区。
///
/// [`AsRef<[u8]>`] 必须暴露本次写入的全部、连续、已初始化字节,且在一次
/// 脱离之前重复借用时长度和内容保持一致。trait 本身不要求 `Send`、`Sync`
/// 或 `'static`;具体 I/O 方法按其线程和生命周期需要追加约束。
///
/// “脱离”只解决异步操作可能需要在调用期借用之外持有字节的问题,不表示
/// 后端会修改输入,也不要求总是复制。第三方实现必须维持字节等价、原值恢复
/// 和一次性配对合同。