Advertisement
Guest User

Untitled

a guest
Sep 19th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.95 KB | None | 0 0
  1. //assert!(new_cap < usize::max_value() >> 8)
  2. use core::mem::ManuallyDrop;
  3.  
  4. #[cfg(target_endian = "little")]
  5. const MAGIC_NUMBER: usize = 23;
  6.  
  7. #[cfg(target_endian = "big")]
  8. const MAGIC_NUMBER: usize = 0;
  9.  
  10. #[cfg(target_endian = "little")]
  11. #[repr(C)]
  12. #[derive(Clone, Debug)]
  13. struct HeapString {
  14. ptr: *mut u8,
  15. len: usize,
  16. cap: usize,
  17. }
  18.  
  19. #[cfg(target_endian = "big")]
  20. #[repr(C)]
  21. #[derive(Clone, Debug)]
  22. struct HeapString {
  23. cap: usize,
  24. len: usize,
  25. ptr: *mut u8,
  26. }
  27.  
  28. impl HeapString {
  29. fn new(ptr: *mut u8, len: usize, cap: usize) -> Self {
  30. Self {
  31. cap,
  32. len,
  33. ptr
  34. }
  35. }
  36.  
  37. unsafe fn as_mut_vec(&mut self) -> ManuallyDrop<Vec<u8>> {
  38. ManuallyDrop::new(Vec::from_raw_parts(self.ptr, self.len, self.cap))
  39. }
  40. }
  41.  
  42. impl Copy for HeapString {}
  43.  
  44. #[repr(C)]
  45. union Buffer {
  46. heap_buffer: HeapString,
  47. fast_buffer: [u8; 24]
  48. }
  49.  
  50. impl Buffer {
  51. fn in_place() -> Self {
  52. let mut fast_buffer = [0; 24];
  53.  
  54. fast_buffer[MAGIC_NUMBER] = 23;
  55.  
  56. Self {
  57. fast_buffer
  58. }
  59. }
  60.  
  61. fn is_in_place(&self) -> bool {
  62. unsafe {
  63. self.fast_buffer[MAGIC_NUMBER] != 0
  64. }
  65. }
  66.  
  67. unsafe fn remaining(&self) -> usize {
  68. self.fast_buffer[MAGIC_NUMBER] as usize
  69. }
  70.  
  71. unsafe fn push_in_place(&mut self, byte: u8) {
  72. let remaining = self.remaining();
  73. assert!(remaining > 0);
  74.  
  75. self.fast_buffer[MAGIC_NUMBER - remaining] = byte;
  76.  
  77. self.fast_buffer[MAGIC_NUMBER] -= 1;
  78. }
  79.  
  80. unsafe fn fast_buffer_as_slice(&self) -> &[u8] {
  81. &self.fast_buffer[..MAGIC_NUMBER]
  82. }
  83. }
  84.  
  85. impl Buffer {
  86. fn in_heap(ptr: *mut u8, len: usize, cap: usize) -> Self {
  87. Self {
  88. heap_buffer: HeapString::new(ptr, len, cap)
  89. }
  90. }
  91.  
  92. unsafe fn push_in_heap(&mut self, byte: u8) {
  93. let mut vec = self.heap_buffer.as_mut_vec();
  94. vec.push(byte);
  95.  
  96. self.heap_buffer.len = vec.len();
  97. self.heap_buffer.cap = vec.capacity();
  98. self.heap_buffer.ptr = vec.as_mut_ptr();
  99. }
  100. }
  101.  
  102. impl Buffer {
  103. unsafe fn as_slice(&self) -> &[u8] {
  104. if self.is_in_place() {
  105. &self.fast_buffer[..MAGIC_NUMBER]
  106. } else {
  107. unsafe {
  108. core::slice::from_raw_parts(self.heap_buffer.ptr, self.heap_buffer.len)
  109. }
  110. }
  111. }
  112. }
  113.  
  114. struct Bstring {
  115. buffer: Buffer
  116. }
  117.  
  118. impl Bstring {
  119. pub fn new() -> Self {
  120. Self {
  121. buffer: Buffer::in_place()
  122. }
  123. }
  124.  
  125. pub fn push(&mut self, byte: u8) {
  126. if self.buffer.is_in_place() {
  127. unsafe { self.buffer.push_in_place(byte) }
  128.  
  129. if !self.buffer.is_in_place() {
  130. let mut v = ManuallyDrop::new(Vec::with_capacity(24));
  131. v.extend_from_slice(unsafe { self.buffer.fast_buffer_as_slice() });
  132. let cap = v.capacity();
  133. let len = v.len();
  134. let ptr = v.as_mut_ptr();
  135.  
  136. self.buffer = Buffer::in_heap(ptr, len, cap)
  137. }
  138. } else {
  139. unsafe { self.buffer.push_in_heap(byte) };
  140. }
  141. }
  142. }
  143.  
  144. impl core::ops::Deref for Bstring {
  145. type Target = [u8];
  146.  
  147. fn deref(&self) -> &Self::Target {
  148. unsafe { self.buffer.as_slice() }
  149. }
  150. }
  151.  
  152. impl Drop for Bstring {
  153. fn drop(&mut self) {
  154. if self.buffer.is_in_place() {
  155.  
  156. } else {
  157. unsafe {
  158. ManuallyDrop::into_inner(self.buffer.heap_buffer.as_mut_vec());
  159. }
  160. }
  161. }
  162. }
  163.  
  164. fn main() {
  165. let mut s = Bstring::new();
  166.  
  167. for b in 1..26 {
  168. s.push(b);
  169. }
  170.  
  171. // let x: &[u8] = &s;
  172. // println!("{:?}", x);
  173. }
  174.  
  175. // #[repr(C)]
  176. // struct Bstring {
  177. // len: usize,
  178. // capacity: usize,
  179. // buffer: Buffer,
  180. // }
  181.  
  182. // impl Bstring {
  183. // pub fn new() -> Self {
  184. // Self {
  185. // buffer: Buffer::in_place(),
  186. // len: 0,
  187. // capacity: 0,
  188. // }
  189. // }
  190.  
  191. // pub fn is_in_place(&self) -> bool {
  192. // self.len == 0
  193. // }
  194.  
  195. // pub fn push(&mut self, b: u8) {
  196. // if self.is_in_place() {
  197. // unsafe {
  198. // self.buffer.push_in_place(b);
  199. // if self.buffer.is_full_in_place() {
  200. // let mut v = ManuallyDrop::new(Vec::with_capacity(24));
  201. // v.extend_from_slice(&self.buffer.buffer[..23]);
  202.  
  203. // let len = v.len();
  204. // let capacity = v.capacity();
  205. // let ptr = v.as_mut_ptr();
  206.  
  207. // self.len = len;
  208. // self.capacity = capacity;
  209. // self.buffer.ptr = ptr;
  210. // }
  211. // }
  212. // } else {
  213. // unsafe {
  214. // ManuallyDrop::new(Vec::from_raw_parts(self.buffer.ptr, self.len, self.capacity)).push(b)
  215. // }
  216. // }
  217. // }
  218. // }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement