MCPcopy Index your code
hub / github.com/BitVM/BitVM / get_transform_steps

Method get_transform_steps

bitvm/src/bigint/std.rs:397–461  ·  view source on GitHub ↗

Generates a vector of TransformStep struct that encodes all the information needed to convert BigInt form one limbsize represention (source) to another (target). used as a helper function for `transform_limbsize`

(source_limb_size: u32, target_limb_size: u32)

Source from the content-addressed store, hash-verified

395 /// convert BigInt form one limbsize represention (source) to another (target).
396 /// used as a helper function for `transform_limbsize`
397 fn get_transform_steps(source_limb_size: u32, target_limb_size: u32) -> Vec<TransformStep> {
398 //define an empty vector to store Transform steps
399 let mut transform_steps: Vec<TransformStep> = Vec::new();
400
401 // compute the number of limbs for target and source
402 let target_n_limbs = N_BITS.div_ceil(target_limb_size);
403 let mut target_limb_remaining_bits = Self::N_BITS - (target_n_limbs - 1) * target_limb_size;
404 let source_n_limbs = N_BITS.div_ceil(source_limb_size);
405 let source_head = Self::N_BITS - (source_n_limbs - 1) * source_limb_size;
406
407 // define a vector of limbsizes of source
408 let mut limb_sizes: Vec<u32> = Vec::with_capacity(source_n_limbs as usize);
409 let mut first_iter_flag = true;
410 for _ in 0..(source_n_limbs - 1) {
411 limb_sizes.push(source_limb_size);
412 }
413 limb_sizes.push(source_head);
414
415 //iterate until all limbs of source are processed
416 while !limb_sizes.is_empty() {
417 //iterate until the target limb is filled completely
418 while target_limb_remaining_bits > 0 {
419 let source_limb_last_idx = limb_sizes.len() - 1;
420 let source_limb_remaining_bits = limb_sizes[source_limb_last_idx];
421
422 match source_limb_remaining_bits.cmp(&target_limb_remaining_bits) {
423 Ordering::Less => {
424 transform_steps.push(TransformStep {
425 current_limb_remaining_bits: source_limb_remaining_bits,
426 extract_window: source_limb_remaining_bits,
427 drop_currentlimb: true,
428 initiate_targetlimb: first_iter_flag,
429 });
430 target_limb_remaining_bits -= source_limb_remaining_bits;
431 limb_sizes.pop();
432 }
433 Ordering::Equal => {
434 transform_steps.push(TransformStep {
435 current_limb_remaining_bits: source_limb_remaining_bits,
436 extract_window: target_limb_remaining_bits,
437 drop_currentlimb: true,
438 initiate_targetlimb: first_iter_flag,
439 });
440 target_limb_remaining_bits = 0;
441 limb_sizes.pop();
442 }
443 Ordering::Greater => {
444 transform_steps.push(TransformStep {
445 current_limb_remaining_bits: source_limb_remaining_bits,
446 extract_window: target_limb_remaining_bits,
447 drop_currentlimb: false,
448 initiate_targetlimb: first_iter_flag,
449 });
450 limb_sizes[source_limb_last_idx] =
451 source_limb_remaining_bits - target_limb_remaining_bits;
452 target_limb_remaining_bits = 0;
453 }
454 }

Callers

nothing calls this directly

Calls 3

is_emptyMethod · 0.80
lenMethod · 0.80
pushMethod · 0.45

Tested by

no test coverage detected