1
- use crate :: { AperSync , StoreHandle } ;
1
+ use crate :: { AperSync , StoreHandle , StoreIterator } ;
2
+ use bytes:: Bytes ;
2
3
use serde:: { de:: DeserializeOwned , Serialize } ;
3
4
4
5
pub struct AtomMap < K : Serialize + DeserializeOwned , V : Serialize + DeserializeOwned > {
@@ -22,18 +23,67 @@ impl<K: Serialize + DeserializeOwned, V: Serialize + DeserializeOwned> AperSync
22
23
impl < K : Serialize + DeserializeOwned , V : Serialize + DeserializeOwned > AtomMap < K , V > {
23
24
pub fn get ( & self , key : & K ) -> Option < V > {
24
25
self . map
25
- . get ( & bincode:: serialize ( key) . unwrap ( ) )
26
+ . get ( & Bytes :: from ( bincode:: serialize ( key) . unwrap ( ) ) )
26
27
. map ( |bytes| bincode:: deserialize ( & bytes) . unwrap ( ) )
27
28
}
28
29
29
30
pub fn set ( & mut self , key : & K , value : & V ) {
30
31
self . map . set (
31
- bincode:: serialize ( key) . unwrap ( ) ,
32
- bincode:: serialize ( value) . unwrap ( ) ,
32
+ Bytes :: from ( bincode:: serialize ( key) . unwrap ( ) ) ,
33
+ Bytes :: from ( bincode:: serialize ( value) . unwrap ( ) ) ,
33
34
) ;
34
35
}
35
36
36
37
pub fn delete ( & mut self , key : & K ) {
37
- self . map . delete ( bincode:: serialize ( key) . unwrap ( ) ) ;
38
+ self . map
39
+ . delete ( Bytes :: from ( bincode:: serialize ( key) . unwrap ( ) ) ) ;
40
+ }
41
+
42
+ pub fn iter ( & self ) -> AtomMapIter < K , V > {
43
+ AtomMapIter {
44
+ iter : self . map . iter ( ) ,
45
+ _phantom : std:: marker:: PhantomData ,
46
+ }
47
+ }
48
+ }
49
+
50
+ pub struct AtomMapIter < K : Serialize + DeserializeOwned , V : Serialize + DeserializeOwned > {
51
+ iter : StoreIterator ,
52
+ _phantom : std:: marker:: PhantomData < ( K , V ) > ,
53
+ }
54
+
55
+ impl < K : Serialize + DeserializeOwned , V : Serialize + DeserializeOwned > Iterator
56
+ for AtomMapIter < K , V >
57
+ {
58
+ type Item = ( K , V ) ;
59
+
60
+ fn next ( & mut self ) -> Option < Self :: Item > {
61
+ let n = self . iter . next ( ) ?;
62
+ let key = bincode:: deserialize ( & n. 0 ) . unwrap ( ) ;
63
+ let value = bincode:: deserialize ( & n. 1 ) . unwrap ( ) ;
64
+ Some ( ( key, value) )
65
+ }
66
+ }
67
+
68
+ #[ cfg( test) ]
69
+ mod test {
70
+ use super :: * ;
71
+
72
+ #[ test]
73
+ fn atom_map_iter ( ) {
74
+ let store = crate :: Store :: default ( ) ;
75
+ let mut map = AtomMap :: < String , String > :: attach ( store. handle ( ) ) ;
76
+
77
+ map. set ( & "h-insert" . to_string ( ) , & "b" . to_string ( ) ) ;
78
+ map. set ( & "a-insert" . to_string ( ) , & "a" . to_string ( ) ) ;
79
+ map. set ( & "z-insert" . to_string ( ) , & "c" . to_string ( ) ) ;
80
+ map. set ( & "f-insert" . to_string ( ) , & "d" . to_string ( ) ) ;
81
+
82
+ let mut iter = map. iter ( ) ;
83
+
84
+ assert_eq ! ( iter. next( ) , Some ( ( "a-insert" . to_string( ) , "a" . to_string( ) ) ) ) ;
85
+ assert_eq ! ( iter. next( ) , Some ( ( "f-insert" . to_string( ) , "d" . to_string( ) ) ) ) ;
86
+ assert_eq ! ( iter. next( ) , Some ( ( "h-insert" . to_string( ) , "b" . to_string( ) ) ) ) ;
87
+ assert_eq ! ( iter. next( ) , Some ( ( "z-insert" . to_string( ) , "c" . to_string( ) ) ) ) ;
38
88
}
39
89
}
0 commit comments