maniac_runtime/utils/
padded.rs1use core::fmt;
2use core::ops::{Deref, DerefMut};
3
4use std::future::IntoFuture;
5
6#[derive(Clone, Copy, Default, Hash, PartialEq, Eq)]
34#[cfg_attr(any(target_arch = "x86_64",), repr(align(64)))]
35#[cfg_attr(
36 any(
37 target_arch = "aarch64",
38 target_arch = "arm64ec",
39 target_arch = "powerpc64",
40 ),
41 repr(align(128))
42)]
43#[cfg_attr(
44 any(
45 target_arch = "arm",
46 target_arch = "mips",
47 target_arch = "mips32r6",
48 target_arch = "mips64",
49 target_arch = "mips64r6",
50 target_arch = "sparc",
51 target_arch = "hexagon",
52 ),
53 repr(align(32))
54)]
55#[cfg_attr(target_arch = "m68k", repr(align(16)))]
56#[cfg_attr(target_arch = "s390x", repr(align(256)))]
57#[cfg_attr(
58 not(any(
59 target_arch = "x86_64",
60 target_arch = "aarch64",
61 target_arch = "arm64ec",
62 target_arch = "powerpc64",
63 target_arch = "arm",
64 target_arch = "mips",
65 target_arch = "mips32r6",
66 target_arch = "mips64",
67 target_arch = "mips64r6",
68 target_arch = "sparc",
69 target_arch = "hexagon",
70 target_arch = "m68k",
71 target_arch = "s390x",
72 )),
73 repr(align(64))
74)]
75pub struct CachePadded<T> {
76 value: T,
77}
78
79unsafe impl<T: Send> Send for CachePadded<T> {}
80unsafe impl<T: Sync> Sync for CachePadded<T> {}
81
82impl<T> CachePadded<T> {
83 pub const fn new(t: T) -> CachePadded<T> {
85 CachePadded::<T> { value: t }
86 }
87
88 pub fn into_inner(self) -> T {
90 self.value
91 }
92}
93
94impl<T> Deref for CachePadded<T> {
95 type Target = T;
96
97 fn deref(&self) -> &T {
98 &self.value
99 }
100}
101
102impl<T> DerefMut for CachePadded<T> {
103 fn deref_mut(&mut self) -> &mut T {
104 &mut self.value
105 }
106}
107
108impl<T: fmt::Debug> fmt::Debug for CachePadded<T> {
109 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
110 f.debug_struct("CachePadded")
111 .field("value", &self.value)
112 .finish()
113 }
114}
115
116impl<T> From<T> for CachePadded<T> {
117 fn from(t: T) -> Self {
118 CachePadded::new(t)
119 }
120}
121
122impl<T: fmt::Display> fmt::Display for CachePadded<T> {
123 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
124 fmt::Display::fmt(&self.value, f)
125 }
126}