File tree Expand file tree Collapse file tree 1 file changed +14
-7
lines changed Expand file tree Collapse file tree 1 file changed +14
-7
lines changed Original file line number Diff line number Diff line change 1
- use std:: collections:: HashSet ;
1
+ use std:: collections:: HashMap ;
2
+ use std:: sync:: Mutex ;
3
+ use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
2
4
3
5
#[ derive( Debug ) ]
4
6
#[ derive( Clone ) ]
@@ -41,29 +43,34 @@ pub struct Object {
41
43
}
42
44
43
45
#[ derive( Debug ) ]
46
+ #[ derive( Hash ) ]
44
47
#[ derive( Clone ) ]
48
+ #[ derive( Eq ) ]
49
+ #[ derive( PartialEq ) ]
45
50
pub struct ObjectRef {
46
- index : usize ,
51
+ id : usize ,
47
52
}
48
53
54
+ static current_ref_id: AtomicUsize = :: std:: sync:: atomic:: ATOMIC_USIZE_INIT ;
55
+
49
56
#[ derive( Debug ) ]
50
57
pub struct ObjectStore {
51
- all_objects : Vec < Object > ,
58
+ all_objects : HashMap < ObjectRef , Object > ,
52
59
}
53
60
54
61
impl ObjectStore {
55
62
pub fn new ( ) -> ObjectStore {
56
- ObjectStore { all_objects : Vec :: new ( ) }
63
+ ObjectStore { all_objects : HashMap :: new ( ) }
57
64
}
58
65
59
66
pub fn allocate ( & mut self , obj : ObjectContent ) -> ObjectRef {
60
- let obj_ref = ObjectRef { index : self . all_objects . len ( ) } ;
61
- self . all_objects . push ( Object { content : obj } ) ;
67
+ let obj_ref = ObjectRef { id : current_ref_id . fetch_add ( 1 , Ordering :: SeqCst ) } ;
68
+ self . all_objects . insert ( obj_ref . clone ( ) , Object { content : obj } ) ;
62
69
obj_ref
63
70
}
64
71
65
72
pub fn deref ( & self , obj_ref : & ObjectRef ) -> & Object {
66
73
// TODO: check the reference is valid
67
- self . all_objects . get ( obj_ref. index ) . unwrap ( )
74
+ self . all_objects . get ( obj_ref) . unwrap ( )
68
75
}
69
76
}
You can’t perform that action at this time.
0 commit comments