@@ -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,52 @@ 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 new ( data : Vec < T > , drop_elements : bool ) -> DropOptimizedVec < T > {
129
+ DropOptimizedVec {
130
+ data,
131
+ drop_elements,
132
+ }
133
+ }
134
+
135
+ pub fn dropping ( data : Vec < T > ) -> DropOptimizedVec < T > {
136
+ Self :: new ( data, true )
137
+ }
138
+
139
+ pub fn non_dropping ( data : Vec < T > ) -> DropOptimizedVec < T > {
140
+ Self :: new ( data, false )
141
+ }
142
+
143
+ pub fn into_vec ( mut self ) -> Vec < T > {
144
+ let mut vec = vec ! [ ] ;
145
+ mem:: swap ( & mut self . data , & mut vec) ;
146
+ vec
147
+ }
148
+ }
149
+
150
+ impl < T > Deref for DropOptimizedVec < T > {
151
+ type Target = Vec < T > ;
152
+
153
+ fn deref ( & self ) -> & Self :: Target {
154
+ & self . data
155
+ }
156
+ }
157
+
158
+ impl < T > Drop for DropOptimizedVec < T > {
159
+ fn drop ( & mut self ) {
160
+ if !self . drop_elements {
161
+ unsafe { self . data . set_len ( 0 ) ; }
162
+ }
163
+ }
164
+ }
165
+
118
166
impl < ' a > TableSpec < ' a > {
119
167
pub const fn borrowed ( ks : & ' a str , table : & ' a str ) -> Self {
120
168
Self {
@@ -355,7 +403,7 @@ impl CqlValue {
355
403
pub fn as_list ( & self ) -> Option < & Vec < CqlValue > > {
356
404
match self {
357
405
Self :: List ( s) => Some ( s) ,
358
- Self :: Vector ( s) => Some ( s) ,
406
+ Self :: Vector ( s) => Some ( & s) ,
359
407
_ => None ,
360
408
}
361
409
}
@@ -385,7 +433,7 @@ impl CqlValue {
385
433
match self {
386
434
Self :: List ( s) => Some ( s) ,
387
435
Self :: Set ( s) => Some ( s) ,
388
- Self :: Vector ( s) => Some ( s) ,
436
+ Self :: Vector ( s) => Some ( s. into_vec ( ) ) ,
389
437
_ => None ,
390
438
}
391
439
}
@@ -836,11 +884,11 @@ pub fn deser_cql_value(
836
884
let v = VectorIterator :: < CqlValue > :: deserialize_vector_of_float_to_vec_of_cql_value (
837
885
typ, v,
838
886
) ?;
839
- CqlValue :: Vector ( v )
887
+ CqlValue :: Vector ( DropOptimizedVec :: non_dropping ( v ) )
840
888
}
841
889
Vector ( _, _) => {
842
890
let v = Vec :: < CqlValue > :: deserialize ( typ, v) ?;
843
- CqlValue :: Vector ( v )
891
+ CqlValue :: Vector ( DropOptimizedVec :: dropping ( v ) )
844
892
}
845
893
} )
846
894
}
0 commit comments