@@ -17,8 +17,11 @@ pub enum Value {
1717 Float ( f64 ) ,
1818 Text ( CacheString ) ,
1919 Boolen ( bool ) ,
20- UserDefined ( * mut c_void , Option < Arc < DeferUnsafe > > ) ,
21- PyObject ( * mut c_void , Arc < DeferUnsafe > ) ,
20+ UserDefined (
21+ * mut c_void , //data
22+ i32 , //kind
23+ Option < Arc < DeferUnsafe > > , // de-allocator
24+ ) ,
2225}
2326
2427impl From < i64 > for Value {
@@ -59,13 +62,13 @@ impl From<bool> for Value {
5962
6063impl From < * mut c_void > for Value {
6164 fn from ( value : * mut c_void ) -> Self {
62- Value :: UserDefined ( value, None )
65+ Value :: UserDefined ( value, 0 , None )
6366 }
6467}
6568
6669impl Value {
67- pub fn pyobj ( ptr : * mut c_void , free : unsafe fn ( * mut c_void ) ) -> Value {
68- Value :: PyObject ( ptr, Arc :: new ( DeferUnsafe ( ptr, free) ) )
70+ pub fn managed ( ptr : * mut c_void , kind : i32 , free : unsafe fn ( * mut c_void ) ) -> Value {
71+ Value :: UserDefined ( ptr, kind , Arc :: new ( DeferUnsafe ( ptr, free) ) . into ( ) )
6972 }
7073}
7174
@@ -75,14 +78,15 @@ impl TryFrom<Value> for i64 {
7578 fn try_from ( value : Value ) -> Result < Self , Self :: Error > {
7679 match value {
7780 Value :: Empty => Err ( "empty value error" . into ( ) ) ,
78- Value :: Int ( v) => Ok ( v) ,
81+ Value :: Int ( v) => Ok ( v. into ( ) ) ,
7982 Value :: Float ( v) => Ok ( v as i64 ) ,
8083 Value :: Text ( v) => v
8184 . parse :: < i64 > ( )
8285 . or_else ( |_| Err ( format ! ( "error convert {} into i64" , v) ) ) ,
8386 Value :: Boolen ( v) => Ok ( v. into ( ) ) ,
84- Value :: UserDefined ( _, _) => Err ( "data type not matched, `Userdefined` and i64" . into ( ) ) ,
85- Value :: PyObject ( _, _) => Err ( "data type not matched, `PyObject` and i64" . into ( ) ) ,
87+ Value :: UserDefined ( _, _, _) => {
88+ Err ( "data type not matched, `UserDefined` and i64" . into ( ) )
89+ }
8690 }
8791 }
8892}
@@ -99,8 +103,9 @@ impl TryFrom<Value> for f64 {
99103 . parse :: < f64 > ( )
100104 . or_else ( |_| Err ( format ! ( "error convert {} into i64" , v) ) ) ,
101105 Value :: Boolen ( _) => Err ( "data type not matched, `Boolen` and i64" . into ( ) ) ,
102- Value :: UserDefined ( _, _) => Err ( "data type not matched, `Userdefined` and f64" . into ( ) ) ,
103- Value :: PyObject ( _, _) => Err ( "data type not matched, `PyObject` and f64" . into ( ) ) ,
106+ Value :: UserDefined ( _, _, _) => {
107+ Err ( "data type not matched, `UserDefined` and f64" . into ( ) )
108+ }
104109 }
105110 }
106111}
@@ -115,8 +120,9 @@ impl TryFrom<Value> for String {
115120 Value :: Float ( v) => Ok ( format ! ( "{}" , v) ) ,
116121 Value :: Text ( v) => Ok ( v. to_string ( ) ) ,
117122 Value :: Boolen ( v) => Ok ( format ! ( "{}" , v) ) ,
118- Value :: UserDefined ( _, _) => Err ( "data type not matched, `Userdefined` and str" . into ( ) ) ,
119- Value :: PyObject ( _, _) => Err ( "data type not matched, `PyObject` and str" . into ( ) ) ,
123+ Value :: UserDefined ( _, _, _) => {
124+ Err ( "data type not matched, `UserDefined` and str" . into ( ) )
125+ }
120126 }
121127 }
122128}
@@ -131,8 +137,9 @@ impl TryFrom<Value> for bool {
131137 Value :: Float ( _) => Err ( "data type not matched, `Float` and bool" . into ( ) ) ,
132138 Value :: Text ( _) => Err ( "data type not matched, `Text` and bool" . into ( ) ) ,
133139 Value :: Boolen ( v) => Ok ( v) ,
134- Value :: UserDefined ( _, _) => Err ( "data type not matched, `Userdefined` and str" . into ( ) ) ,
135- Value :: PyObject ( _, _) => Err ( "data type not matched, `PyObject` and str" . into ( ) ) ,
140+ Value :: UserDefined ( _, _, _) => {
141+ Err ( "data type not matched, `UserDefined` and str" . into ( ) )
142+ }
136143 }
137144 }
138145}
@@ -182,11 +189,10 @@ impl Entry {
182189 }
183190
184191 pub fn update < V : Into < Value > > ( & mut self , val : V ) {
185- let his = self . val . history ( ) ;
186- if his. is_none ( ) {
187- self . val = EntryValue :: Single ( val. into ( ) ) ;
192+ if let Some ( his) = self . val . history ( ) {
193+ self . val = EntryValue :: Versioned ( val. into ( ) , his. clone ( ) ) ;
188194 } else {
189- self . val = EntryValue :: Versioned ( val. into ( ) , ( * his . unwrap ( ) ) . clone ( ) ) ;
195+ self . val = EntryValue :: Single ( val. into ( ) ) ;
190196 }
191197 }
192198
@@ -196,13 +202,10 @@ impl Entry {
196202 }
197203
198204 pub fn rollback ( & mut self ) -> Result < ( ) , ( ) > {
199- let his = self . val . history ( ) ;
200- match his {
201- None => Err ( ( ) ) ,
202- Some ( h) => {
203- self . val = * h. clone ( ) ;
204- Ok ( ( ) )
205- }
205+ if let Some ( h) = self . val . history ( ) {
206+ self . val = * h. clone ( ) ;
207+ return Ok ( ( ) ) ;
206208 }
209+ return Err ( ( ) ) ;
207210 }
208211}
0 commit comments