@@ -12,7 +12,9 @@ use crate::types::deserialize::value::{
12
12
use crate :: types:: deserialize:: { DeserializationError , FrameSlice } ;
13
13
use bytes:: { Buf , Bytes } ;
14
14
use std:: borrow:: Cow ;
15
- use std:: { convert:: TryInto , net:: IpAddr , result:: Result as StdResult , str} ;
15
+ use std:: { convert:: TryInto , mem, net:: IpAddr , result:: Result as StdResult , str} ;
16
+ use std:: mem:: ManuallyDrop ;
17
+ use std:: ops:: Deref ;
16
18
use uuid:: Uuid ;
17
19
18
20
#[ derive( Debug ) ]
@@ -96,7 +98,7 @@ pub enum CqlValue {
96
98
List ( Vec < CqlValue > ) ,
97
99
Map ( Vec < ( CqlValue , CqlValue ) > ) ,
98
100
Set ( Vec < CqlValue > ) ,
99
- Vector ( Vec < CqlValue > ) ,
101
+ Vector ( DropOptimizedVec < CqlValue > ) ,
100
102
UserDefinedType {
101
103
keyspace : String ,
102
104
type_name : String ,
@@ -115,6 +117,50 @@ pub enum CqlValue {
115
117
Varint ( CqlVarint ) ,
116
118
}
117
119
120
+
121
+ #[ derive( Clone , Debug , PartialEq ) ]
122
+ pub struct DropOptimizedVec < T > {
123
+ data : Vec < T > ,
124
+ drop_elements : bool
125
+ }
126
+
127
+ impl < T > DropOptimizedVec < T > {
128
+ pub fn dropping ( data : Vec < T > ) -> DropOptimizedVec < T > {
129
+ DropOptimizedVec {
130
+ data,
131
+ drop_elements : true ,
132
+ }
133
+ }
134
+ pub fn non_dropping ( data : Vec < T > ) -> DropOptimizedVec < T > {
135
+ DropOptimizedVec {
136
+ data,
137
+ drop_elements : false ,
138
+ }
139
+ }
140
+
141
+ pub fn into_vec ( mut self ) -> Vec < T > {
142
+ let mut vec = vec ! [ ] ;
143
+ mem:: swap ( & mut self . data , & mut vec) ;
144
+ vec
145
+ }
146
+ }
147
+
148
+ impl < T > Deref for DropOptimizedVec < T > {
149
+ type Target = Vec < T > ;
150
+
151
+ fn deref ( & self ) -> & Self :: Target {
152
+ & self . data
153
+ }
154
+ }
155
+
156
+ impl < T > Drop for DropOptimizedVec < T > {
157
+ fn drop ( & mut self ) {
158
+ if !self . drop_elements {
159
+ unsafe { self . data . set_len ( 0 ) ; }
160
+ }
161
+ }
162
+ }
163
+
118
164
impl < ' a > TableSpec < ' a > {
119
165
pub const fn borrowed ( ks : & ' a str , table : & ' a str ) -> Self {
120
166
Self {
@@ -355,7 +401,7 @@ impl CqlValue {
355
401
pub fn as_list ( & self ) -> Option < & Vec < CqlValue > > {
356
402
match self {
357
403
Self :: List ( s) => Some ( s) ,
358
- Self :: Vector ( s) => Some ( s) ,
404
+ Self :: Vector ( s) => Some ( & s) ,
359
405
_ => None ,
360
406
}
361
407
}
@@ -385,7 +431,7 @@ impl CqlValue {
385
431
match self {
386
432
Self :: List ( s) => Some ( s) ,
387
433
Self :: Set ( s) => Some ( s) ,
388
- Self :: Vector ( s) => Some ( s) ,
434
+ Self :: Vector ( s) => Some ( s. into_vec ( ) ) ,
389
435
_ => None ,
390
436
}
391
437
}
@@ -836,11 +882,11 @@ pub fn deser_cql_value(
836
882
let v = VectorIterator :: < CqlValue > :: deserialize_vector_of_float_to_vec_of_cql_value (
837
883
typ, v,
838
884
) ?;
839
- CqlValue :: Vector ( v )
885
+ CqlValue :: Vector ( DropOptimizedVec :: non_dropping ( v ) )
840
886
}
841
887
Vector ( _, _) => {
842
888
let v = Vec :: < CqlValue > :: deserialize ( typ, v) ?;
843
- CqlValue :: Vector ( v )
889
+ CqlValue :: Vector ( DropOptimizedVec :: dropping ( v ) )
844
890
}
845
891
} )
846
892
}
0 commit comments