Advertisement
Guest User

Untitled

a guest
Jun 19th, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.13 KB | None | 0 0
  1. use std::ptr;
  2. use std::marker::PhantomData;
  3. use std::fmt;
  4. use std::slice;
  5.  
  6. #[derive(Debug, Copy, Clone)]
  7. enum ChannelType{
  8. CONTROL,
  9. AUDIO,
  10. STR,
  11. }
  12.  
  13. enum Writable{}
  14. enum Readable{}
  15. enum AudioChannel{}
  16. enum ControlChannel{}
  17. enum StrChannel{}
  18.  
  19. trait InputChannelPtr<T: ?Sized>{
  20. fn write(&self, inp: T);
  21. }
  22.  
  23. trait OutputChannelPtr<'a, T: ?Sized>{
  24. fn read(&'a self) -> &'a T;
  25. }
  26.  
  27.  
  28. #[derive(Debug)]
  29. pub struct ControlChannelPtr<'a, C, T> {
  30. ptr: *mut f64,
  31. len: usize,
  32. phantom: PhantomData<&'a T>,
  33. phantomC: PhantomData<C>,
  34. }
  35.  
  36.  
  37. impl<'a> OutputChannelPtr<'a, f64> for ControlChannelPtr<'a, ControlChannel, Readable>{
  38. fn read(&'a self) -> &'a f64{
  39. unsafe{
  40. &*self.ptr
  41. }
  42. }
  43.  
  44. }
  45.  
  46. impl<'a> InputChannelPtr<f64> for ControlChannelPtr<'a, ControlChannel, Writable>{
  47. fn write(&self, inp: f64){
  48. unsafe{
  49. *self.ptr = inp;
  50. println!("input {}", *self.ptr);
  51. }
  52. }
  53. }
  54.  
  55. impl<'a> OutputChannelPtr<'a, [f64]> for ControlChannelPtr<'a, AudioChannel, Readable>{
  56.  
  57. fn read(&'a self) -> &[f64]{
  58. unsafe {
  59. slice::from_raw_parts(self.ptr as *const f64, self.len)
  60. }
  61. }
  62. }
  63.  
  64. impl<'a> InputChannelPtr<&[f64]> for ControlChannelPtr<'a, AudioChannel, Writable>{
  65. fn write(&self, inp: &[f64]){
  66. let mut len = inp.len();
  67. let size = self.len;
  68. if size < len {
  69. len = size;
  70. }
  71. unsafe {
  72. std::ptr::copy(inp.as_ptr(), self.ptr, len);
  73. }
  74. }
  75. }
  76.  
  77. impl<'a> OutputChannelPtr<'a, [u8]> for ControlChannelPtr<'a, StrChannel, Readable>{
  78. fn read(&'a self) -> &'a [u8]{
  79. unsafe {
  80. slice::from_raw_parts(self.ptr as *const u8, self.len)
  81. }
  82. }
  83. }
  84.  
  85. impl<'a> InputChannelPtr<&[u8]> for ControlChannelPtr<'a, StrChannel, Writable>{
  86. fn write(&self, inp: &[u8]){
  87. let mut len = inp.len();
  88. let size = self.len;
  89. if size < len {
  90. len = size;
  91. }
  92. unsafe {
  93. std::ptr::copy(inp.as_ptr(), self.ptr as *mut u8, len);
  94. }
  95. }
  96. }
  97.  
  98.  
  99. impl<'a, C> ControlChannelPtr<'a, C, Writable>{
  100.  
  101. fn writable(ctype: ChannelType)-> Self {
  102. ControlChannelPtr::new(ctype)
  103. }
  104. }
  105.  
  106. impl<'a, C> ControlChannelPtr<'a, C, Readable>{
  107.  
  108. fn readable(ctype: ChannelType)-> Self {
  109. ControlChannelPtr::new(ctype)
  110. }
  111. }
  112.  
  113. impl<'a,C, T> ControlChannelPtr<'a, C, T>{
  114.  
  115. fn new(ctype: ChannelType)-> Self {
  116. let mut len = 0usize;
  117. let ptr = match ctype {
  118. ChannelType::CONTROL => {
  119. println!("control channel");
  120. len = 1;
  121. Box::into_raw(Box::new(0.0)) as *mut f64
  122. }
  123. ChannelType::AUDIO => {
  124. println!("audio channel");
  125. len = 6;
  126. let vec = vec![0.0f64; 6];
  127. Box::into_raw( vec.into_boxed_slice() ) as *mut f64
  128. }
  129. ChannelType::STR => {
  130. println!("string channel");
  131. let string = "Hello World".to_owned().into_bytes();
  132. len = string.len(); // longitud numero de elementos del tipo u8
  133. Box::into_raw( string.into_boxed_slice() ) as *mut f64
  134. }
  135. };
  136. let phantom = PhantomData;
  137. let phantomC = PhantomData;
  138. Self{
  139. ptr,
  140. len,
  141. phantom,
  142. phantomC,
  143. }
  144. }
  145. }
  146.  
  147. impl<'a, C, T> Drop for ControlChannelPtr<'a, C, T> {
  148. fn drop(&mut self) {
  149. unsafe{
  150. let _ = Box::from_raw(self.ptr);
  151. }
  152. println!("Dropping!");
  153. }
  154. }
  155.  
  156. fn get_input_channel<'a, C>(ctype: ChannelType) -> ControlChannelPtr<'a, C, Writable> {
  157. ControlChannelPtr::writable(ctype)
  158. }
  159.  
  160.  
  161. fn main() {
  162.  
  163. let audio = get_input_channel::<AudioChannel>(ChannelType::AUDIO);
  164. let mut slice = vec![10.25, 145.2, 0.002, 0.014, 235.8, 134.25];
  165. let mut sl = [0.5; 6];
  166. audio.write(slice.as_slice());
  167.  
  168. let string = get_input_channel::<StrChannel>(ChannelType::STR);
  169. let str = "Hello natam".to_owned();
  170. string.write(str.as_bytes());
  171.  
  172. let control = get_input_channel::<ControlChannel>(ChannelType::CONTROL);
  173. let data = 15.25;
  174. control.write(data);
  175.  
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement