Guest User

Untitled

a guest
May 27th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.72 KB | None | 0 0
  1. trait SubClass<T> {
  2. fn superclass(&mut self) -> &mut T;
  3. }
  4.  
  5. macro_rules! class{
  6. ($structname:ident:$classname:ident {$($name:ident:$tp:ty),*})=>(
  7. struct $structname {
  8. $( $name : $tp , )*
  9. }
  10. trait $classname {
  11. $( fn $name ( &mut self ) -> &mut $tp; )*
  12. }
  13. impl<T:SubClass<$structname>> $classname for T {
  14. $(
  15. fn $name ( &mut self ) -> &mut $tp {
  16. self . superclass() . $name()
  17. }
  18. )*
  19. }
  20. impl $classname for $structname {
  21. $(
  22. fn $name ( &mut self ) -> &mut $tp {
  23. &mut self . $name
  24. }
  25. )*
  26. }
  27. );
  28. ($structname:ident:$classname:ident extends $fatherstruct:ident:$fatherclass:ident {$($name:ident:$tp:ty),*})=>(
  29. struct $structname {
  30. $( $name : $tp , )*
  31. superobject: $fatherstruct ,
  32. }
  33. trait $classname:$fatherclass {
  34. $( fn $name ( &mut self ) -> &mut $tp; )*
  35. }
  36. impl SubClass<$fatherstruct> for $structname{
  37. fn superclass(&mut self)->&mut $fatherstruct{
  38. &mut (self.superobject)
  39. }
  40. }
  41. impl $classname for $structname {
  42. $(
  43. fn $name ( &mut self ) -> &mut $tp {
  44. &mut self . $name
  45. }
  46. )*
  47. }
  48. )
  49. }
  50. class!{
  51. Foo:FooTrait {
  52. name:i32
  53. }
  54. }
  55.  
  56. class!{
  57. Bar:BarTrait extends Foo:FooTrait {
  58. age:i32
  59. }
  60. }
  61. fn printname(mut input:impl FooTrait) {
  62. println!("{}", input.name());
  63. }
  64. fn main() {
  65. let bar = Bar {
  66. age: 14,
  67. superobject: Foo { name: 234 },
  68. };
  69. printname(bar);
  70. }
Add Comment
Please, Sign In to add comment