1
1
use crate :: pyobject:: PyObjectRef ;
2
+ use num_bigint:: BigInt ;
2
3
3
4
use crate :: function:: OptionalArg ;
4
5
@@ -13,8 +14,12 @@ use std::hash::{Hash, Hasher};
13
14
use super :: objint;
14
15
use super :: objsequence:: PySliceableSequence ;
15
16
use crate :: obj:: objint:: PyInt ;
17
+ use num_integer:: Integer ;
16
18
use num_traits:: ToPrimitive ;
17
19
20
+ use super :: objbytearray:: { get_value as get_value_bytearray, PyByteArray } ;
21
+ use super :: objbytes:: PyBytes ;
22
+
18
23
#[ derive( Debug , Default , Clone ) ]
19
24
pub struct PyByteInner {
20
25
pub elements : Vec < u8 > ,
@@ -305,6 +310,15 @@ impl PyByteInner {
305
310
self . elements . to_ascii_uppercase ( )
306
311
}
307
312
313
+ pub fn capitalize ( & self , _vm : & VirtualMachine ) -> Vec < u8 > {
314
+ let mut new: Vec < u8 > = Vec :: new ( ) ;
315
+ if let Some ( ( first, second) ) = self . elements . split_first ( ) {
316
+ new. push ( first. to_ascii_uppercase ( ) ) ;
317
+ second. iter ( ) . for_each ( |x| new. push ( x. to_ascii_lowercase ( ) ) ) ;
318
+ }
319
+ new
320
+ }
321
+
308
322
pub fn hex ( & self , vm : & VirtualMachine ) -> PyResult {
309
323
let bla = self
310
324
. elements
@@ -346,4 +360,39 @@ impl PyByteInner {
346
360
. map ( |x| x. unwrap ( ) )
347
361
. collect :: < Vec < u8 > > ( ) )
348
362
}
363
+
364
+ pub fn center ( & self , width : & BigInt , fillbyte : u8 , _vm : & VirtualMachine ) -> Vec < u8 > {
365
+ let width = width. to_usize ( ) . unwrap ( ) ;
366
+
367
+ // adjust right et left side
368
+ if width <= self . len ( ) {
369
+ return self . elements . clone ( ) ;
370
+ }
371
+ let diff: usize = width - self . len ( ) ;
372
+ let mut ln: usize = diff / 2 ;
373
+ let mut rn: usize = ln;
374
+
375
+ if diff. is_odd ( ) && self . len ( ) % 2 == 0 {
376
+ ln += 1
377
+ }
378
+
379
+ if diff. is_odd ( ) && self . len ( ) % 2 != 0 {
380
+ rn += 1
381
+ }
382
+
383
+ // merge all
384
+ let mut res = vec ! [ fillbyte; ln] ;
385
+ res. extend_from_slice ( & self . elements [ ..] ) ;
386
+ res. extend_from_slice ( & vec ! [ fillbyte; rn] [ ..] ) ;
387
+
388
+ res
389
+ }
390
+ }
391
+
392
+ pub fn is_byte ( obj : & PyObjectRef ) -> Option < Vec < u8 > > {
393
+ match_class ! ( obj. clone( ) ,
394
+
395
+ i @ PyBytes => Some ( i. get_value( ) . to_vec( ) ) ,
396
+ j @ PyByteArray => Some ( get_value_bytearray( & j. as_object( ) ) . to_vec( ) ) ,
397
+ _ => None )
349
398
}
0 commit comments