@@ -14,7 +14,7 @@ use super::objnone::PyNoneRef;
14
14
use super :: objsequence:: PySliceableSequence ;
15
15
use super :: objslice:: PySliceRef ;
16
16
use super :: objstr:: { self , PyString , PyStringRef } ;
17
- use super :: pystr:: { self , PyCommonString , StringRange } ;
17
+ use super :: pystr:: { self , PyCommonString , PyCommonStringWrapper , StringRange } ;
18
18
use crate :: function:: { OptionalArg , OptionalOption } ;
19
19
use crate :: pyhash;
20
20
use crate :: pyobject:: {
@@ -255,43 +255,7 @@ impl ByteInnerTranslateOptions {
255
255
}
256
256
}
257
257
258
- #[ derive( FromArgs ) ]
259
- pub struct ByteInnerSplitOptions {
260
- #[ pyarg( positional_or_keyword, default = "None" ) ]
261
- sep : Option < PyByteInner > ,
262
- #[ pyarg( positional_or_keyword, default = "-1" ) ]
263
- maxsplit : isize ,
264
- }
265
-
266
- impl ByteInnerSplitOptions {
267
- pub fn get_value ( self , vm : & VirtualMachine ) -> PyResult < ( Option < Vec < u8 > > , isize ) > {
268
- let sep = if let Some ( s) = self . sep {
269
- let sep = s. elements ;
270
- if sep. is_empty ( ) {
271
- return Err ( vm. new_value_error ( "empty separator" . to_owned ( ) ) ) ;
272
- }
273
- Some ( sep)
274
- } else {
275
- None
276
- } ;
277
- Ok ( ( sep, self . maxsplit ) )
278
- }
279
- }
280
-
281
- #[ derive( FromArgs ) ]
282
- pub struct ByteInnerExpandtabsOptions {
283
- #[ pyarg( positional_or_keyword, optional = true ) ]
284
- tabsize : OptionalArg < PyIntRef > ,
285
- }
286
-
287
- impl ByteInnerExpandtabsOptions {
288
- pub fn get_value ( self ) -> usize {
289
- match self . tabsize . into_option ( ) {
290
- Some ( int) => int. as_bigint ( ) . to_usize ( ) . unwrap_or ( 0 ) ,
291
- None => 8 ,
292
- }
293
- }
294
- }
258
+ pub type ByteInnerSplitOptions = pystr:: SplitArgs < PyByteInner , [ u8 ] , u8 > ;
295
259
296
260
#[ derive( FromArgs ) ]
297
261
pub struct ByteInnerSplitlinesOptions {
@@ -970,19 +934,13 @@ impl PyByteInner {
970
934
where
971
935
F : Fn ( & [ u8 ] , & VirtualMachine ) -> PyObjectRef ,
972
936
{
973
- let ( sep, maxsplit) = options. get_value ( vm) ?;
974
- let sep_ref = match sep {
975
- Some ( ref v) => Some ( & v[ ..] ) ,
976
- None => None ,
977
- } ;
978
937
let elements = self . elements . py_split (
979
- sep_ref,
980
- maxsplit,
938
+ options,
981
939
vm,
982
940
|v, s, vm| v. split_str ( s) . map ( |v| convert ( v, vm) ) . collect ( ) ,
983
941
|v, s, n, vm| v. splitn_str ( n, s) . map ( |v| convert ( v, vm) ) . collect ( ) ,
984
942
|v, n, vm| v. py_split_whitespace ( n, |v| convert ( v, vm) ) ,
985
- ) ;
943
+ ) ? ;
986
944
Ok ( vm. ctx . new_list ( elements) )
987
945
}
988
946
@@ -995,19 +953,13 @@ impl PyByteInner {
995
953
where
996
954
F : Fn ( & [ u8 ] , & VirtualMachine ) -> PyObjectRef ,
997
955
{
998
- let ( sep, maxsplit) = options. get_value ( vm) ?;
999
- let sep_ref = match sep {
1000
- Some ( ref v) => Some ( & v[ ..] ) ,
1001
- None => None ,
1002
- } ;
1003
956
let mut elements = self . elements . py_split (
1004
- sep_ref,
1005
- maxsplit,
957
+ options,
1006
958
vm,
1007
959
|v, s, vm| v. rsplit_str ( s) . map ( |v| convert ( v, vm) ) . collect ( ) ,
1008
960
|v, s, n, vm| v. rsplitn_str ( n, s) . map ( |v| convert ( v, vm) ) . collect ( ) ,
1009
961
|v, n, vm| v. py_rsplit_whitespace ( n, |v| convert ( v, vm) ) ,
1010
- ) ;
962
+ ) ? ;
1011
963
elements. reverse ( ) ;
1012
964
Ok ( vm. ctx . new_list ( elements) )
1013
965
}
@@ -1050,8 +1002,8 @@ impl PyByteInner {
1050
1002
Ok ( ( front, has_mid, back) )
1051
1003
}
1052
1004
1053
- pub fn expandtabs ( & self , options : ByteInnerExpandtabsOptions ) -> Vec < u8 > {
1054
- let tabsize = options. get_value ( ) ;
1005
+ pub fn expandtabs ( & self , options : pystr :: ExpandTabsArgs ) -> Vec < u8 > {
1006
+ let tabsize = options. tabsize ( ) ;
1055
1007
let mut counter: usize = 0 ;
1056
1008
let mut res = vec ! [ ] ;
1057
1009
@@ -1082,9 +1034,7 @@ impl PyByteInner {
1082
1034
res
1083
1035
}
1084
1036
1085
- pub fn splitlines ( & self , options : ByteInnerSplitlinesOptions ) -> Vec < & [ u8 ] > {
1086
- let keepends = options. get_value ( ) ;
1087
-
1037
+ pub fn splitlines ( & self , options : pystr:: SplitLinesArgs ) -> Vec < & [ u8 ] > {
1088
1038
let mut res = vec ! [ ] ;
1089
1039
1090
1040
if self . elements . is_empty ( ) {
@@ -1093,7 +1043,7 @@ impl PyByteInner {
1093
1043
1094
1044
let mut prev_index = 0 ;
1095
1045
let mut index = 0 ;
1096
- let keep = if keepends { 1 } else { 0 } ;
1046
+ let keep = if options . keepends { 1 } else { 0 } ;
1097
1047
let slice = & self . elements ;
1098
1048
1099
1049
while index < slice. len ( ) {
@@ -1435,13 +1385,23 @@ pub fn bytes_zfill(bytes: &[u8], width: usize) -> Vec<u8> {
1435
1385
}
1436
1386
}
1437
1387
1388
+ impl PyCommonStringWrapper < [ u8 ] > for PyByteInner {
1389
+ fn as_ref ( & self ) -> & [ u8 ] {
1390
+ & self . elements
1391
+ }
1392
+ }
1393
+
1438
1394
const ASCII_WHITESPACES : [ u8 ; 6 ] = [ 0x20 , 0x09 , 0x0a , 0x0c , 0x0d , 0x0b ] ;
1439
1395
1440
- impl PyCommonString < ' _ , u8 > for [ u8 ] {
1396
+ impl PyCommonString < u8 > for [ u8 ] {
1441
1397
fn get_slice ( & self , range : std:: ops:: Range < usize > ) -> & Self {
1442
1398
& self [ range]
1443
1399
}
1444
1400
1401
+ fn is_empty ( & self ) -> bool {
1402
+ Self :: is_empty ( self )
1403
+ }
1404
+
1445
1405
fn len ( & self ) -> usize {
1446
1406
Self :: len ( self )
1447
1407
}
0 commit comments