@@ -88,16 +88,16 @@ where
88
88
#[ inline( always) ]
89
89
pub fn parse_pgvector_svector < T : Zero + Clone , F > (
90
90
input : & [ u8 ] ,
91
- reserve : usize ,
92
91
f : F ,
93
- ) -> Result < Vec < T > , ParseVectorError >
92
+ ) -> Result < ( Vec < u32 > , Vec < T > , usize ) , ParseVectorError >
94
93
where
95
94
F : Fn ( & str ) -> Option < T > ,
96
95
{
97
96
use arrayvec:: ArrayVec ;
98
97
if input. is_empty ( ) {
99
98
return Err ( ParseVectorError :: EmptyString { } ) ;
100
99
}
100
+ let mut dims: usize = 0 ;
101
101
let left = ' a: {
102
102
for position in 0 ..input. len ( ) - 1 {
103
103
match input[ position] {
@@ -109,7 +109,6 @@ where
109
109
return Err ( ParseVectorError :: BadParentheses { character : '{' } ) ;
110
110
} ;
111
111
let mut token: ArrayVec < u8 , 48 > = ArrayVec :: new ( ) ;
112
- let mut capacity = reserve;
113
112
let right = ' a: {
114
113
for position in ( 1 ..input. len ( ) ) . rev ( ) {
115
114
match input[ position] {
@@ -121,7 +120,7 @@ where
121
120
b'/' => {
122
121
token. reverse ( ) ;
123
122
let s = unsafe { std:: str:: from_utf8_unchecked ( & token[ ..] ) } ;
124
- capacity = s
123
+ dims = s
125
124
. parse :: < usize > ( )
126
125
. map_err ( |_| ParseVectorError :: BadParsing { position } ) ?;
127
126
}
@@ -135,8 +134,9 @@ where
135
134
}
136
135
return Err ( ParseVectorError :: BadParentheses { character : '}' } ) ;
137
136
} ;
138
- let mut vector = vec ! [ T :: zero( ) ; capacity] ;
139
- let mut index: usize = 0 ;
137
+ let mut indexes = Vec :: < u32 > :: new ( ) ;
138
+ let mut values = Vec :: < T > :: new ( ) ;
139
+ let mut index: u32 = 0 ;
140
140
for position in left + 1 ..right {
141
141
let c = input[ position] ;
142
142
match c {
@@ -153,7 +153,8 @@ where
153
153
// Safety: all bytes in `token` are ascii characters
154
154
let s = unsafe { std:: str:: from_utf8_unchecked ( & token[ 1 ..] ) } ;
155
155
let num = f ( s) . ok_or ( ParseVectorError :: BadParsing { position } ) ?;
156
- vector[ index] = num;
156
+ indexes. push ( index) ;
157
+ values. push ( num) ;
157
158
token. clear ( ) ;
158
159
} else {
159
160
return Err ( ParseVectorError :: TooShortNumber { position } ) ;
@@ -164,7 +165,7 @@ where
164
165
// Safety: all bytes in `token` are ascii characters
165
166
let s = unsafe { std:: str:: from_utf8_unchecked ( & token[ 1 ..] ) } ;
166
167
index = s
167
- . parse :: < usize > ( )
168
+ . parse :: < u32 > ( )
168
169
. map_err ( |_| ParseVectorError :: BadParsing { position } ) ?;
169
170
token. clear ( ) ;
170
171
} else {
@@ -180,8 +181,9 @@ where
180
181
// Safety: all bytes in `token` are ascii characters
181
182
let s = unsafe { std:: str:: from_utf8_unchecked ( & token[ 1 ..] ) } ;
182
183
let num = f ( s) . ok_or ( ParseVectorError :: BadParsing { position } ) ?;
183
- vector[ index] = num;
184
+ indexes. push ( index) ;
185
+ values. push ( num) ;
184
186
token. clear ( ) ;
185
187
}
186
- Ok ( vector )
188
+ Ok ( ( indexes , values , dims ) )
187
189
}
0 commit comments