Skip to content

Commit 046bd9b

Browse files
committed
reactor bytes.center
1 parent 8693adc commit 046bd9b

File tree

1 file changed

+77
-45
lines changed

1 file changed

+77
-45
lines changed

vm/src/obj/objbyteinner.rs

Lines changed: 77 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ use std::collections::hash_map::DefaultHasher;
1212
use std::hash::{Hash, Hasher};
1313

1414
use super::objint;
15+
use super::objsequence::{is_valid_slice_arg, PySliceableSequence};
1516
use super::objtype;
16-
use super::objsequence::{PySliceableSequence, is_valid_slice_arg};
1717
use crate::obj::objint::PyInt;
1818
use num_integer::Integer;
1919
use num_traits::ToPrimitive;
@@ -364,47 +364,66 @@ impl PyByteInner {
364364
.collect::<Vec<u8>>())
365365
}
366366

367-
pub fn center(&self, width_a: PyObjectRef, fillbyte: OptionalArg<PyObjectRef>, vm: &VirtualMachine) -> PyResult<Vec<u8>> {
367+
fn get_center_args(
368+
&self,
369+
width_a: PyObjectRef,
370+
fillbyte: OptionalArg<PyObjectRef>,
371+
fn_name: String,
372+
vm: &VirtualMachine,
373+
) -> PyResult<(u8, usize)> {
368374
let fillbyte = if let OptionalArg::Present(v) = fillbyte {
369375
match try_as_byte(&v) {
370376
Some(x) => {
371377
if x.len() == 1 {
372378
x[0]
373379
} else {
374380
return Err(vm.new_type_error(format!(
375-
"center() argument 2 must be a byte string of length 1, not {}",
376-
&v
381+
"{}() argument 2 must be a byte string of length 1, not {}",
382+
&fn_name, &v
377383
)));
378384
}
379385
}
380386
None => {
381387
return Err(vm.new_type_error(format!(
382-
"center() argument 2 must be a byte string of length 1, not {}",
383-
&v
388+
"{}() argument 2 must be a byte string of length 1, not {}",
389+
&fn_name, &v
384390
)));
385391
}
386392
}
387393
} else {
388-
32 // default is space
394+
b' ' // default is space
389395
};
390396

391-
let width_b = match_class!(width_a,
397+
let width_b = match_class!(width_a,
392398
i @PyInt => i,
393399
obj => {return Err(vm.new_type_error(format!("{} cannot be interpreted as an integer", obj)));}
394400
);
395401

396-
397402
// <0 = no change
398403
let width = if let Some(x) = width_b.as_bigint().to_usize() {
399-
x
400-
} else {return Ok(self.elements.clone());};
401-
404+
if x <= self.len() {
405+
0
406+
} else {
407+
x
408+
}
409+
} else {
410+
0
411+
};
412+
413+
let diff: usize = if width != 0 { width - self.len() } else { 0 };
414+
415+
Ok((fillbyte, diff))
416+
}
417+
418+
pub fn center(
419+
&self,
420+
width_a: PyObjectRef,
421+
fillbyte: OptionalArg<PyObjectRef>,
422+
vm: &VirtualMachine,
423+
) -> PyResult<Vec<u8>> {
424+
let fn_name = "center".to_string();
425+
let (fillbyte, diff) = self.get_center_args(width_a, fillbyte, fn_name, vm)?;
402426

403-
// adjust right et left side
404-
if width <= self.len() {
405-
return Ok(self.elements.clone());
406-
}
407-
let diff: usize = width - self.len();
408427
let mut ln: usize = diff / 2;
409428
let mut rn: usize = ln;
410429

@@ -434,8 +453,7 @@ impl PyByteInner {
434453
let sub = match try_as_bytes_like(&sub) {
435454
Some(value) => value,
436455
None => match_class!(sub,
437-
i @ PyInt =>
438-
vec![i.as_bigint().byte_or(vm)?],
456+
i @ PyInt => vec![i.as_bigint().byte_or(vm)?],
439457
obj => {return Err(vm.new_type_error(format!("argument should be integer or bytes-like object, not {}", obj)));}),
440458
};
441459
let start = if let OptionalArg::Present(st) = start {
@@ -563,8 +581,7 @@ impl PyByteInner {
563581
let sub = match try_as_bytes_like(&sub) {
564582
Some(value) => value,
565583
None => match_class!(sub,
566-
i @ PyInt =>
567-
vec![i.as_bigint().byte_or(vm)?],
584+
i @ PyInt => vec![i.as_bigint().byte_or(vm)?],
568585
obj => {return Err(vm.new_type_error(format!("a bytes-like object is required, not {}", obj)));}),
569586
};
570587

@@ -582,63 +599,78 @@ impl PyByteInner {
582599

583600
let slice = &self.elements[range];
584601
for (n, _) in slice.iter().enumerate() {
585-
if n + sub.len() <= slice.len()
586-
&& &slice[n..n + sub.len()] == sub.as_slice()
587-
{
588-
return Ok((start+n) as isize);
602+
if n + sub.len() <= slice.len() && &slice[n..n + sub.len()] == sub.as_slice() {
603+
return Ok((start + n) as isize);
589604
}
590605
}
591606
Ok(-1isize)
592607
}
593608

594-
pub fn maketrans(from: PyObjectRef, to: PyObjectRef, vm :&VirtualMachine) -> PyResult{
595-
let mut res = vec![];
609+
pub fn maketrans(from: PyObjectRef, to: PyObjectRef, vm: &VirtualMachine) -> PyResult {
610+
let mut res = vec![];
596611

597612
let from = match try_as_bytes_like(&from) {
598613
Some(value) => value,
599-
None => {return Err(vm.new_type_error(format!("a bytes-like object is required, not {}", from)));},
614+
None => {
615+
return Err(
616+
vm.new_type_error(format!("a bytes-like object is required, not {}", from))
617+
);
618+
}
600619
};
601620

602621
let to = match try_as_bytes_like(&to) {
603622
Some(value) => value,
604-
None => {return Err(vm.new_type_error(format!("a bytes-like object is required, not {}", to)));},
623+
None => {
624+
return Err(
625+
vm.new_type_error(format!("a bytes-like object is required, not {}", to))
626+
);
627+
}
605628
};
606629

607630
for i in 0..=255 {
608-
res.push(if let Some(position) = from.iter().position(|&x| x ==i) {
631+
res.push(if let Some(position) = from.iter().position(|&x| x == i) {
609632
to[position]
610-
} else {
633+
} else {
611634
i
612635
});
613636
}
614637

615638
Ok(vm.ctx.new_bytes(res))
616639
}
617-
pub fn translate(&self, table: PyObjectRef, delete: OptionalArg<PyObjectRef>, vm :&VirtualMachine) -> PyResult{
640+
pub fn translate(
641+
&self,
642+
table: PyObjectRef,
643+
delete: OptionalArg<PyObjectRef>,
644+
vm: &VirtualMachine,
645+
) -> PyResult {
618646
let table = match try_as_bytes_like(&table) {
619647
Some(value) => value,
620-
None => {
621-
match_class!(table,
648+
None => match_class!(table,
622649

623-
_n @ PyNone => (0..=255).collect::<Vec<u8>>(),
624-
obj => {return Err(vm.new_type_error(format!("a bytes-like object is required, not {}", obj)));},
625-
)
626-
}
650+
_n @ PyNone => (0..=255).collect::<Vec<u8>>(),
651+
obj => {return Err(vm.new_type_error(format!("a bytes-like object is required, not {}", obj)));},
652+
),
627653
};
628654

629655
if table.len() != 256 {
630-
return Err(vm.new_value_error("translation table must be 256 characters long".to_string()));
656+
return Err(
657+
vm.new_value_error("translation table must be 256 characters long".to_string())
658+
);
631659
}
632660

633-
634-
635661
let delete = if let OptionalArg::Present(value) = delete {
636-
match try_as_bytes_like(&value) {
662+
match try_as_bytes_like(&value) {
637663
Some(value) => value,
638-
None => {return Err(vm.new_type_error(format!("a bytes-like object is required, not {}", value)));}
664+
None => {
665+
return Err(vm.new_type_error(format!(
666+
"a bytes-like object is required, not {}",
667+
value
668+
)));
669+
}
639670
}
640-
} else {vec![]};
641-
671+
} else {
672+
vec![]
673+
};
642674

643675
let mut res = vec![];
644676

0 commit comments

Comments
 (0)