1#![no_std]
21
22use core::{ptr, slice};
23use core::marker::PhantomData;
24use core::ops::{Index, IndexMut};
25
26#[repr(C)]
32#[derive(Clone, Copy)]
33pub struct CSlice<'a, T> {
34 base: *const T,
35 len: usize,
36 marker: PhantomData<&'a ()>
37}
38
39impl<'a, T> CSlice<'a, T> {
40 pub unsafe fn new(base: *const T, len: usize) -> Self {
47 assert!(base != ptr::null());
48 CSlice {
49 base: base,
50 len: len,
51 marker: PhantomData
52 }
53 }
54
55 pub fn as_ptr(&self) -> *const T {
57 self.base
58 }
59
60 pub fn len(&self) -> usize {
62 self.len
63 }
64}
65
66impl<'a, T> AsRef<[T]> for CSlice<'a, T> {
67 fn as_ref(&self) -> &[T] {
68 unsafe {
69 slice::from_raw_parts(self.base, self.len)
70 }
71 }
72}
73
74#[repr(C)]
80#[derive(Clone, Copy)]
81pub struct CMutSlice<'a, T> {
82 base: *mut T,
83 len: usize,
84 marker: PhantomData<&'a ()>
85}
86
87impl<'a, T> CMutSlice<'a, T> {
88 pub unsafe fn new(base: *mut T, len: usize) -> Self {
95 assert!(base != ptr::null_mut());
96 CMutSlice {
97 base: base,
98 len: len,
99 marker: PhantomData
100 }
101 }
102
103 pub fn as_ptr(&self) -> *const T {
105 self.base
106 }
107
108 pub fn as_mut_ptr(&mut self) -> *mut T {
110 self.base
111 }
112
113 pub fn as_slice(&self) -> &'a [T] {
115 unsafe {
116 slice::from_raw_parts(self.base, self.len)
117 }
118 }
119
120 pub fn as_mut_slice(&mut self) -> &'a mut [T] {
122 unsafe {
123 slice::from_raw_parts_mut(self.base, self.len)
124 }
125 }
126
127 pub fn len(&self) -> usize {
129 self.len
130 }
131}
132
133impl<'a, T> AsRef<[T]> for CMutSlice<'a, T> {
134 fn as_ref(&self) -> &[T] {
135 unsafe {
136 slice::from_raw_parts(self.base, self.len)
137 }
138 }
139}
140
141impl<'a, T> AsMut<[T]> for CMutSlice<'a, T> {
142 fn as_mut(&mut self) -> &mut [T] {
143 unsafe {
144 slice::from_raw_parts_mut(self.base, self.len)
145 }
146 }
147}
148
149unsafe impl<'a, T: Sync> Sync for CSlice<'a, T> { }
150
151unsafe impl<'a, T: Sync> Send for CSlice<'a, T> { }
152
153unsafe impl<'a, T: Sync> Sync for CMutSlice<'a, T> { }
154
155unsafe impl<'a, T: Send> Send for CMutSlice<'a, T> { }
156
157impl<'a, T> Index<usize> for CSlice<'a, T> {
158 type Output = T;
159
160 fn index(&self, i: usize) -> &T {
161 self.as_ref().index(i)
162 }
163}
164
165impl<'a, T> Index<usize> for CMutSlice<'a, T> {
166 type Output = T;
167
168 fn index(&self, i: usize) -> &T {
169 self.as_ref().index(i)
170 }
171}
172
173impl<'a, T> IndexMut<usize> for CMutSlice<'a, T> {
174 fn index_mut(&mut self, i: usize) -> &mut T {
175 self.as_mut().index_mut(i)
176 }
177}
178
179pub trait AsCSlice<'a, T> {
181 fn as_c_slice(&'a self) -> CSlice<'a, T>;
183}
184
185pub trait AsCMutSlice<'a, T> {
187 fn as_c_mut_slice(&'a mut self) -> CMutSlice<'a, T>;
189}
190
191impl<'a> AsCSlice<'a, u8> for str {
192 fn as_c_slice(&'a self) -> CSlice<'a, u8> {
193 CSlice {
194 base: self.as_ptr(),
195 len: self.len(),
196 marker: PhantomData
197 }
198 }
199}
200
201impl<'a, T> AsCSlice<'a, T> for [T] {
202 fn as_c_slice(&'a self) -> CSlice<'a, T> {
203 CSlice {
204 base: self.as_ptr(),
205 len: self.len(),
206 marker: PhantomData
207 }
208 }
209}
210
211impl<'a, T> AsCMutSlice<'a, T> for [T] {
212 fn as_c_mut_slice(&'a mut self) -> CMutSlice<'a, T> {
213 CMutSlice {
214 base: self.as_mut_ptr(),
215 len: self.len(),
216 marker: PhantomData
217 }
218 }
219}