1 //! Buffer management for same-process client<->server communication.
3 use std
::io
::{self, Write}
;
5 use std
::ops
::{Deref, DerefMut}
;
14 unsafe impl<'a
, T
: Sync
> Sync
for Slice
<'a
, T
> {}
15 unsafe impl<'a
, T
: Sync
> Send
for Slice
<'a
, T
> {}
17 impl<T
> Copy
for Slice
<'a
, T
> {}
18 impl<T
> Clone
for Slice
<'a
, T
> {
19 fn clone(&self) -> Self {
24 impl<T
> From
<&'a
[T
]> for Slice
<'a
, T
> {
25 fn from(xs
: &'a
[T
]) -> Self {
27 data
: unsafe { &*(xs.as_ptr() as *const [T; 0]) }
,
33 impl<T
> Deref
for Slice
<'a
, T
> {
35 fn deref(&self) -> &[T
] {
36 unsafe { slice::from_raw_parts(self.data.as_ptr(), self.len) }
41 pub struct Buffer
<T
: Copy
> {
45 extend_from_slice
: extern "C" fn(Buffer
<T
>, Slice
<'_
, T
>) -> Buffer
<T
>,
46 drop
: extern "C" fn(Buffer
<T
>),
49 unsafe impl<T
: Copy
+ Sync
> Sync
for Buffer
<T
> {}
50 unsafe impl<T
: Copy
+ Send
> Send
for Buffer
<T
> {}
52 impl<T
: Copy
> Default
for Buffer
<T
> {
53 fn default() -> Self {
58 impl<T
: Copy
> Deref
for Buffer
<T
> {
60 fn deref(&self) -> &[T
] {
61 unsafe { slice::from_raw_parts(self.data as *const T, self.len) }
65 impl<T
: Copy
> DerefMut
for Buffer
<T
> {
66 fn deref_mut(&mut self) -> &mut [T
] {
67 unsafe { slice::from_raw_parts_mut(self.data, self.len) }
71 impl<T
: Copy
> Buffer
<T
> {
72 pub(super) fn new() -> Self {
76 pub(super) fn clear(&mut self) {
80 pub(super) fn take(&mut self) -> Self {
84 pub(super) fn extend_from_slice(&mut self, xs
: &[T
]) {
85 // Fast path to avoid going through an FFI call.
86 if let Some(final_len
) = self.len
.checked_add(xs
.len()) {
87 if final_len
<= self.capacity
{
88 let dst
= unsafe { slice::from_raw_parts_mut(self.data, self.capacity) }
;
89 dst
[self.len
..][..xs
.len()].copy_from_slice(xs
);
95 *self = (b
.extend_from_slice
)(b
, Slice
::from(xs
));
99 impl Write
for Buffer
<u8> {
100 fn write(&mut self, xs
: &[u8]) -> io
::Result
<usize> {
101 self.extend_from_slice(xs
);
105 fn write_all(&mut self, xs
: &[u8]) -> io
::Result
<()> {
106 self.extend_from_slice(xs
);
110 fn flush(&mut self) -> io
::Result
<()> {
115 impl<T
: Copy
> Drop
for Buffer
<T
> {
122 impl<T
: Copy
> From
<Vec
<T
>> for Buffer
<T
> {
123 fn from(mut v
: Vec
<T
>) -> Self {
124 let (data
, len
, capacity
) = (v
.as_mut_ptr(), v
.len(), v
.capacity());
127 // This utility function is nested in here because it can *only*
128 // be safely called on `Buffer`s created by *this* `proc_macro`.
129 fn to_vec
<T
: Copy
>(b
: Buffer
<T
>) -> Vec
<T
> {
138 Vec
::from_raw_parts(data
, len
, capacity
)
142 extern "C" fn extend_from_slice
<T
: Copy
>(b
: Buffer
<T
>, xs
: Slice
<'_
, T
>) -> Buffer
<T
> {
143 let mut v
= to_vec(b
);
144 v
.extend_from_slice(&xs
);
148 extern "C" fn drop
<T
: Copy
>(b
: Buffer
<T
>) {
149 mem
::drop(to_vec(b
));