]>
Commit | Line | Data |
---|---|---|
c30ab7b3 SL |
1 | //! Platform-independent platform abstraction |
2 | //! | |
476ff2be | 3 | //! This is the platform-independent portion of the standard library's |
c30ab7b3 SL |
4 | //! platform abstraction layer, whereas `std::sys` is the |
5 | //! platform-specific portion. | |
6 | //! | |
7 | //! The relationship between `std::sys_common`, `std::sys` and the | |
8 | //! rest of `std` is complex, with dependencies going in all | |
9 | //! directions: `std` depending on `sys_common`, `sys_common` | |
10 | //! depending on `sys`, and `sys` depending on `sys_common` and `std`. | |
cdc7bbd5 XL |
11 | //! This is because `sys_common` not only contains platform-independent code, |
12 | //! but also code that is shared between the different platforms in `sys`. | |
13 | //! Ideally all that shared code should be moved to `sys::common`, | |
14 | //! and the dependencies between `std`, `sys_common` and `sys` all would form a dag. | |
15 | //! Progress on this is tracked in #84187. | |
c30ab7b3 | 16 | |
1a4d82fc | 17 | #![allow(missing_docs)] |
32a655c1 | 18 | #![allow(missing_debug_implementations)] |
1a4d82fc | 19 | |
1b1a35ee XL |
20 | #[cfg(test)] |
21 | mod tests; | |
22 | ||
1a4d82fc | 23 | pub mod backtrace; |
dfeec247 | 24 | pub mod fs; |
e9174d1e | 25 | pub mod io; |
923072b8 | 26 | pub mod lazy_box; |
17df50a5 | 27 | pub mod memchr; |
2b03887a | 28 | pub mod once; |
dfeec247 | 29 | pub mod process; |
1a4d82fc JJ |
30 | pub mod thread; |
31 | pub mod thread_info; | |
3dfed10e | 32 | pub mod thread_local_dtor; |
6522a427 EL |
33 | pub mod thread_parking; |
34 | pub mod wstr; | |
85aaf69f | 35 | pub mod wtf8; |
1a4d82fc | 36 | |
2b03887a FG |
37 | cfg_if::cfg_if! { |
38 | if #[cfg(target_os = "windows")] { | |
39 | pub use crate::sys::thread_local_key; | |
40 | } else { | |
41 | pub mod thread_local_key; | |
42 | } | |
43 | } | |
44 | ||
dc9dc135 | 45 | cfg_if::cfg_if! { |
fc512014 | 46 | if #[cfg(any(target_os = "l4re", |
e74abb32 | 47 | target_os = "hermit", |
3dfed10e | 48 | feature = "restricted-std", |
3c0e092e | 49 | all(target_family = "wasm", not(target_os = "emscripten")), |
0731742a | 50 | all(target_vendor = "fortanix", target_env = "sgx")))] { |
532ac7d7 | 51 | pub use crate::sys::net; |
abe05a73 XL |
52 | } else { |
53 | pub mod net; | |
54 | } | |
55 | } | |
476ff2be | 56 | |
1a4d82fc JJ |
57 | // common error constructors |
58 | ||
85aaf69f SL |
59 | /// A trait for viewing representations from std types |
60 | #[doc(hidden)] | |
61 | pub trait AsInner<Inner: ?Sized> { | |
1a4d82fc JJ |
62 | fn as_inner(&self) -> &Inner; |
63 | } | |
64 | ||
85aaf69f SL |
65 | /// A trait for viewing representations from std types |
66 | #[doc(hidden)] | |
67 | pub trait AsInnerMut<Inner: ?Sized> { | |
68 | fn as_inner_mut(&mut self) -> &mut Inner; | |
69 | } | |
70 | ||
71 | /// A trait for extracting representations from std types | |
72 | #[doc(hidden)] | |
73 | pub trait IntoInner<Inner> { | |
74 | fn into_inner(self) -> Inner; | |
75 | } | |
76 | ||
77 | /// A trait for creating std types from internal representations | |
78 | #[doc(hidden)] | |
79 | pub trait FromInner<Inner> { | |
80 | fn from_inner(inner: Inner) -> Self; | |
81 | } | |
e9174d1e | 82 | |
92a42be0 SL |
83 | // Computes (value*numer)/denom without overflow, as long as both |
84 | // (numer*denom) and the overall result fit into i64 (which is the case | |
85 | // for our time conversions). | |
86 | #[allow(dead_code)] // not used on all platforms | |
87 | pub fn mul_div_u64(value: u64, numer: u64, denom: u64) -> u64 { | |
88 | let q = value / denom; | |
89 | let r = value % denom; | |
90 | // Decompose value as (value/denom*denom + value%denom), | |
91 | // substitute into (value*numer)/denom and simplify. | |
92 | // r < denom, so (denom*numer) is the upper bound of (r*numer) | |
93 | q * numer + r * numer / denom | |
94 | } |