@@ -161,96 +161,80 @@ inline void url_search_params::remove(const std::string_view key,
161
161
});
162
162
}
163
163
164
- // returns -1 if str1 < str2, 0 if str1 == str2, 1 if str1 > str2
165
- // the comparison is done using the UTF-16 code units of the UTF-8 code points
166
- inline int compare_utf8_as_utf16 (std::string_view str1, std::string_view str2) {
167
- size_t i = 0 ;
168
- size_t j = 0 ;
169
- uint32_t low_surrogate1 = 0 ;
170
- uint32_t low_surrogate2 = 0 ;
171
- while (i < str1.size () && j < str2.size ()) {
172
- uint32_t codePoint1 = 0 ;
173
- uint32_t codePoint2 = 0 ;
174
-
175
- if (low_surrogate1 != 0 ) {
176
- codePoint1 = low_surrogate1;
177
- low_surrogate1 = 0 ;
178
- } else {
179
- uint8_t c1 = uint8_t (str1[i]);
180
- if (c1 <= 0x7F ) {
181
- codePoint1 = c1;
182
- i++;
183
- } else if (c1 <= 0xDF ) {
184
- codePoint1 = ((c1 & 0x1F ) << 6 ) | (uint8_t (str1[i + 1 ]) & 0x3F );
185
- i += 2 ;
186
- } else if (c1 <= 0xEF ) {
187
- codePoint1 = ((c1 & 0x0F ) << 12 ) |
188
- ((uint8_t (str1[i + 1 ]) & 0x3F ) << 6 ) |
189
- (uint8_t (str1[i + 2 ]) & 0x3F );
190
- i += 3 ;
164
+ inline void url_search_params::sort () {
165
+ std::ranges::stable_sort (params, [](const key_value_pair &lhs,
166
+ const key_value_pair &rhs) {
167
+ size_t i = 0 , j = 0 ;
168
+ uint32_t low_surrogate1 = 0 , low_surrogate2 = 0 ;
169
+ while (i < lhs.first .size () && j < rhs.first .size ()) {
170
+ uint32_t codePoint1 = 0 , codePoint2 = 0 ;
171
+
172
+ if (low_surrogate1 != 0 ) {
173
+ codePoint1 = low_surrogate1;
174
+ low_surrogate1 = 0 ;
191
175
} else {
192
- codePoint1 = ((c1 & 0x07 ) << 18 ) |
193
- ((uint8_t (str1[i + 1 ]) & 0x3F ) << 12 ) |
194
- ((uint8_t (str1[i + 2 ]) & 0x3F ) << 6 ) |
195
- (uint8_t (str1[i + 3 ]) & 0x3F );
196
- i += 4 ;
197
-
198
- codePoint1 -= 0x10000 ;
199
- uint16_t high_surrogate = uint16_t (0xD800 + (codePoint1 >> 10 ));
200
- low_surrogate1 = uint16_t (0xDC00 + (codePoint1 & 0x3FF ));
201
- codePoint1 = high_surrogate;
176
+ uint8_t c1 = uint8_t (lhs.first [i]);
177
+ if (c1 <= 0x7F ) {
178
+ codePoint1 = c1;
179
+ i++;
180
+ } else if (c1 <= 0xDF ) {
181
+ codePoint1 = ((c1 & 0x1F ) << 6 ) | (uint8_t (lhs.first [i + 1 ]) & 0x3F );
182
+ i += 2 ;
183
+ } else if (c1 <= 0xEF ) {
184
+ codePoint1 = ((c1 & 0x0F ) << 12 ) |
185
+ ((uint8_t (lhs.first [i + 1 ]) & 0x3F ) << 6 ) |
186
+ (uint8_t (lhs.first [i + 2 ]) & 0x3F );
187
+ i += 3 ;
188
+ } else {
189
+ codePoint1 = ((c1 & 0x07 ) << 18 ) |
190
+ ((uint8_t (lhs.first [i + 1 ]) & 0x3F ) << 12 ) |
191
+ ((uint8_t (lhs.first [i + 2 ]) & 0x3F ) << 6 ) |
192
+ (uint8_t (lhs.first [i + 3 ]) & 0x3F );
193
+ i += 4 ;
194
+
195
+ codePoint1 -= 0x10000 ;
196
+ uint16_t high_surrogate = uint16_t (0xD800 + (codePoint1 >> 10 ));
197
+ low_surrogate1 = uint16_t (0xDC00 + (codePoint1 & 0x3FF ));
198
+ codePoint1 = high_surrogate;
199
+ }
202
200
}
203
- }
204
201
205
- if (low_surrogate2 != 0 ) {
206
- codePoint2 = low_surrogate2;
207
- low_surrogate2 = 0 ;
208
- } else {
209
- uint8_t c2 = uint8_t (str2[j]);
210
- if (c2 <= 0x7F ) {
211
- codePoint2 = c2;
212
- j++;
213
- } else if (c2 <= 0xDF ) {
214
- codePoint2 = ((c2 & 0x1F ) << 6 ) | (uint8_t (str2[j + 1 ]) & 0x3F );
215
- j += 2 ;
216
- } else if (c2 <= 0xEF ) {
217
- codePoint2 = ((c2 & 0x0F ) << 12 ) |
218
- ((uint8_t (str2[j + 1 ]) & 0x3F ) << 6 ) |
219
- (uint8_t (str2[j + 2 ]) & 0x3F );
220
- j += 3 ;
202
+ if (low_surrogate2 != 0 ) {
203
+ codePoint2 = low_surrogate2;
204
+ low_surrogate2 = 0 ;
221
205
} else {
222
- codePoint2 = ((c2 & 0x07 ) << 18 ) |
223
- ((uint8_t (str2[j + 1 ]) & 0x3F ) << 12 ) |
224
- ((uint8_t (str2[j + 2 ]) & 0x3F ) << 6 ) |
225
- (uint8_t (str2[j + 3 ]) & 0x3F );
226
- j += 4 ;
227
- codePoint2 -= 0x10000 ;
228
- uint16_t high_surrogate = uint16_t (0xD800 + (codePoint2 >> 10 ));
229
- low_surrogate2 = uint16_t (0xDC00 + (codePoint2 & 0x3FF ));
230
- codePoint2 = high_surrogate;
206
+ uint8_t c2 = uint8_t (rhs.first [j]);
207
+ if (c2 <= 0x7F ) {
208
+ codePoint2 = c2;
209
+ j++;
210
+ } else if (c2 <= 0xDF ) {
211
+ codePoint2 = ((c2 & 0x1F ) << 6 ) | (uint8_t (rhs.first [j + 1 ]) & 0x3F );
212
+ j += 2 ;
213
+ } else if (c2 <= 0xEF ) {
214
+ codePoint2 = ((c2 & 0x0F ) << 12 ) |
215
+ ((uint8_t (rhs.first [j + 1 ]) & 0x3F ) << 6 ) |
216
+ (uint8_t (rhs.first [j + 2 ]) & 0x3F );
217
+ j += 3 ;
218
+ } else {
219
+ codePoint2 = ((c2 & 0x07 ) << 18 ) |
220
+ ((uint8_t (rhs.first [j + 1 ]) & 0x3F ) << 12 ) |
221
+ ((uint8_t (rhs.first [j + 2 ]) & 0x3F ) << 6 ) |
222
+ (uint8_t (rhs.first [j + 3 ]) & 0x3F );
223
+ j += 4 ;
224
+ codePoint2 -= 0x10000 ;
225
+ uint16_t high_surrogate = uint16_t (0xD800 + (codePoint2 >> 10 ));
226
+ low_surrogate2 = uint16_t (0xDC00 + (codePoint2 & 0x3FF ));
227
+ codePoint2 = high_surrogate;
228
+ }
231
229
}
232
- }
233
230
234
- if (codePoint1 != codePoint2) {
235
- return (codePoint1 < codePoint2) ? -1 : 1 ;
231
+ if (codePoint1 != codePoint2) {
232
+ return (codePoint1 < codePoint2);
233
+ }
236
234
}
237
- }
238
235
239
- if (i < str1.size ()) {
240
- return 1 ;
241
- }
242
- if (j < str2.size ()) {
243
- return -1 ;
244
- }
245
-
246
- return 0 ;
247
- }
248
-
249
- inline void url_search_params::sort () {
250
- std::ranges::stable_sort (
251
- params, [](const key_value_pair &lhs, const key_value_pair &rhs) {
252
- return compare_utf8_as_utf16 (lhs.first , rhs.first ) == -1 ;
253
- });
236
+ return (i < lhs.first .size ());
237
+ });
254
238
}
255
239
256
240
inline url_search_params_keys_iter url_search_params::get_keys () {
0 commit comments