Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.22 KB | None | 0 0
  1. trait Field {
  2. type ValueType;
  3. }
  4.  
  5. use std::marker::PhantomData as Marker;
  6.  
  7. struct X<T>(Marker<T>);
  8. struct Y<T>(Marker<T>);
  9. struct Z<T>(Marker<T>);
  10.  
  11. impl<T> Field for X<T> {
  12. type ValueType = T;
  13. }
  14.  
  15. impl<T> Field for Y<T> {
  16. type ValueType = T;
  17. }
  18.  
  19. impl<T> Field for Z<T> {
  20. type ValueType = T;
  21. }
  22.  
  23. trait HasField<F: Field> {
  24. fn field(&self) -> &F::ValueType;
  25. fn field_mut(&mut self) -> &mut F::ValueType;
  26. }
  27.  
  28. #[derive(Debug, Default)]
  29. struct Vec3<T>(T, T, T);
  30.  
  31. impl<T> HasField<X<T>> for Vec3<T> {
  32. fn field(&self) -> &<X<T> as Field>::ValueType { &self.0 }
  33. fn field_mut(&mut self) -> &mut <X<T> as Field>::ValueType { &mut self.0 }
  34. }
  35.  
  36. impl<T> HasField<Y<T>> for Vec3<T> {
  37. fn field(&self) -> &<Y<T> as Field>::ValueType { &self.1 }
  38. fn field_mut(&mut self) -> &mut <Y<T> as Field>::ValueType { &mut self.1 }
  39. }
  40.  
  41. impl<T> HasField<Z<T>> for Vec3<T> {
  42. fn field(&self) -> &<Z<T> as Field>::ValueType { &self.2 }
  43. fn field_mut(&mut self) -> &mut <Z<T> as Field>::ValueType { &mut self.2 }
  44. }
  45.  
  46. fn main() {
  47. let mut vec = Vec3::<u32>::default();
  48. *HasField::<X<_>>::field_mut(&mut vec) = 1;
  49. *HasField::<Y<_>>::field_mut(&mut vec) = 2;
  50. *HasField::<Z<_>>::field_mut(&mut vec) = 3;
  51. println!("{:?}", vec);
  52. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement