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
//! 独立于平台的平台抽象
//!
//! 这是标准库的平台抽象层的与平台无关的部分,而 `std::sys` 是特定于平台的部分。
//!
//! `std::sys_common`,`std::sys` 和 `std` 的剩余部分之间的关系很复杂,依赖性在各个方向上: `std` 取决于 `sys_common`,`sys_common` 取决于 `sys`,`sys` 取决于 `sys_common` 和 `std`。
//!
//! 这是因为 `sys_common` 不仅包含与平台无关的代码,还包含 `sys` 中不同平台之间共享的代码。
//! 理想情况下,所有共享代码都应该移动到 `sys::common`,并且 `std`、`sys_common` 和 `sys` 之间的依赖关系都会形成一个 dag。
//! 在 #84187 中跟踪了这方面的进展。
//!
//!
//!
//!
//!
//!

#![allow(missing_docs)]
#![allow(missing_debug_implementations)]

#[cfg(test)]
mod tests;

pub mod backtrace;
pub mod fs;
pub mod io;
pub mod lazy_box;
pub mod memchr;
pub mod once;
pub mod process;
pub mod thread;
pub mod thread_info;
pub mod thread_local_dtor;
pub mod thread_parking;
pub mod wstr;
pub mod wtf8;

cfg_if::cfg_if! {
    if #[cfg(target_os = "windows")] {
        pub use crate::sys::thread_local_key;
    } else {
        pub mod thread_local_key;
    }
}

cfg_if::cfg_if! {
    if #[cfg(any(target_os = "l4re",
                 feature = "restricted-std",
                 all(target_family = "wasm", not(target_os = "emscripten")),
                 all(target_vendor = "fortanix", target_env = "sgx")))] {
        pub use crate::sys::net;
    } else {
        pub mod net;
    }
}

// 常见错误构造函数

/// 一个 trait,用于查看 std 类型的表示
#[doc(hidden)]
pub trait AsInner<Inner: ?Sized> {
    fn as_inner(&self) -> &Inner;
}

/// 一个 trait,用于查看 std 类型的表示
#[doc(hidden)]
pub trait AsInnerMut<Inner: ?Sized> {
    fn as_inner_mut(&mut self) -> &mut Inner;
}

/// 一个 trait,用于从 std 类型中提取表示
#[doc(hidden)]
pub trait IntoInner<Inner> {
    fn into_inner(self) -> Inner;
}

/// 一个 trait,用于从内部表示形式创建 std 类型
#[doc(hidden)]
pub trait FromInner<Inner> {
    fn from_inner(inner: Inner) -> Self;
}

// 只要 (numer *denom) 和总体结果都适合 i64 (时间转换就是这种情况),就可以计算 (值* 数值) / 面值而不会溢出。
//
//
#[allow(dead_code)] // 并非在所有平台上都使用
pub fn mul_div_u64(value: u64, numer: u64, denom: u64) -> u64 {
    let q = value / denom;
    let r = value % denom;
    // 将值分解为 (value/denom *denom + value%denom),代入 (value* numer) /denom 并进行简化。
    //
    // r < denom,所以 (denom*numer) 是 (r*numer) 的上限
    q * numer + r * numer / denom
}