Advertisement
Guest User

Untitled

a guest
Aug 21st, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.70 KB | None | 0 0
  1. use std::rc::Rc;
  2. use std::any::Any;
  3.  
  4. struct Test1;
  5.  
  6. struct Test2;
  7.  
  8. impl Test for Test1 {
  9. fn test(&self) -> i16 {
  10. return 1;
  11. }
  12. }
  13.  
  14.  
  15. impl Test for Test2 {
  16. fn test(&self) -> i16 {
  17. return 2;
  18. }
  19. }
  20.  
  21.  
  22. impl MTest for Test2 {
  23. fn m_test(&self) -> i32 {
  24. return 3;
  25. }
  26. }
  27.  
  28. trait Test {
  29. fn test(&self) -> i16;
  30. }
  31.  
  32. trait MTest: Test {
  33. fn m_test(&self) -> i32;
  34. }
  35.  
  36. trait Converter {
  37. type T: ?Sized;
  38. type O;
  39. fn convert(b: Rc<Any>) -> Option<Rc<Self::T>>;
  40. }
  41.  
  42. struct Test1Converter;
  43.  
  44. impl Converter for Test1Converter {
  45. type T = Test;
  46. type O = Test1;
  47.  
  48. fn convert(b: Rc<Any>) -> Option<Rc<Self::T>> {
  49. if let Ok(d) = Rc::downcast::<Self::O>(b) {
  50. Some(d as Rc<Self::T>)
  51. } else { None }
  52. }
  53. }
  54.  
  55. struct Test2Converter;
  56.  
  57. impl Converter for Test2Converter {
  58. type T = Test;
  59. type O = Test2;
  60.  
  61. fn convert(b: Rc<Any>) -> Option<Rc<Self::T>> {
  62. if let Ok(d) = Rc::downcast::<Self::O>(b) {
  63. Some(d as Rc<Self::T>)
  64. } else { None }
  65. }
  66. }
  67.  
  68. struct Test2MConverter;
  69.  
  70. impl Converter for Test2MConverter {
  71. type T = MTest;
  72. type O = Test2;
  73.  
  74. fn convert(b: Rc<Any>) -> Option<Rc<Self::T>> {
  75. if let Ok(d) = Rc::downcast::<Self::O>(b) {
  76. Some(d as Rc<Self::T>)
  77. } else { None }
  78. }
  79. }
  80.  
  81. fn get<Conv: Converter>(vec: &Vec<Rc<Any>>, i: usize) -> Rc<Conv::T> {
  82. Conv::convert(vec[i].clone()).unwrap()
  83. }
  84.  
  85. fn main() {
  86. let mut vec : Vec<Rc<Any>> = Vec::new();
  87.  
  88. vec.push(Rc::new(Test1));
  89. vec.push(Rc::new(Test2));
  90.  
  91. println!("{}", get::<Test1Converter>(&vec, 0).test());
  92. println!("{}", get::<Test2Converter>(&vec, 1).test());
  93. println!("{}", get::<Test2MConverter>(&vec, 1).m_test());
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement