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 > ,
@@ -355,4 +360,39 @@ impl PyByteInner {
355
360
. map ( |x| x. unwrap ( ) )
356
361
. collect :: < Vec < u8 > > ( ) )
357
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 )
358
398
}
0 commit comments