Guest User

Untitled

a guest
Jun 20th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.82 KB | None | 0 0
  1. use std::cell::{Ref, RefCell, RefMut};
  2. use std::collections::HashMap;
  3. use std::rc::Rc;
  4.  
  5. pub trait MyTrait {
  6. fn get_id(&self) -> i32;
  7. fn print_message(&self);
  8. fn mut_message(&mut self, String);
  9. }
  10.  
  11. #[derive(Default)]
  12. pub struct Object {
  13. message: String,
  14. id: i32,
  15. }
  16.  
  17. impl Object {
  18. pub fn new(id: i32) -> Object {
  19. Object {
  20. id,
  21. message: String::from("\"Default message\""),
  22. ..Default::default()
  23. }
  24. }
  25. }
  26.  
  27. impl MyTrait for Object {
  28. fn get_id(&self) -> i32 {
  29. self.id
  30. }
  31. fn print_message(&self) {
  32. println!("Object {}: {}", self.id, self.message);
  33. }
  34.  
  35. fn mut_message(&mut self, message: String) {
  36. self.message = message
  37. }
  38. }
  39.  
  40. #[derive(Default)]
  41. pub struct Scene {
  42. objects: HashMap<i32, Rc<RefCell<MyTrait>>>,
  43. }
  44.  
  45. impl Scene {
  46. pub fn new() -> Scene {
  47. Scene {
  48. ..Default::default()
  49. }
  50. }
  51.  
  52. pub fn add(&mut self, object: impl MyTrait + 'static) -> i32 {
  53. let id = object.get_id();
  54. self.objects
  55. .insert(id.clone(), Rc::new(RefCell::new(object)));
  56. id
  57. }
  58.  
  59. pub fn get(&self, id: &i32) -> Ref<MyTrait + 'static> {
  60. self.objects
  61. .get(id)
  62. .map(|x| x.borrow())
  63. .expect("Object Not found")
  64. }
  65.  
  66. pub fn get_mut(&mut self, id: &i32) -> RefMut<MyTrait + 'static> {
  67. self.objects
  68. .get_mut(id)
  69. .map(|x| x.borrow_mut())
  70. .expect("Object Not found")
  71. }
  72. }
  73.  
  74. fn main() {
  75. let mut scene = Scene::new();
  76.  
  77. let id_0 = scene.add(Object::new(0));
  78. let id_1 = scene.add(Object::new(1));
  79. let id_2 = scene.add(Object::new(2));
  80.  
  81. let s = scene.get(&id_0);
  82. s.print_message();
  83.  
  84. let w = scene.get(&id_1);
  85. w.print_message();
  86.  
  87. let z = scene.get_mut(&id_2);
  88. z.print_message();
  89. }
Add Comment
Please, Sign In to add comment