Skip to content

Commit

Permalink
decouple magic number from current lib; tag 0.1.0-a4
Browse files Browse the repository at this point in the history
  • Loading branch information
tiye committed Oct 13, 2021
1 parent 83d4d6f commit 521d036
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 16 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "dual_balanced_ternary"
version = "0.1.0-a3"
version = "0.1.0-a4"
edition = "2018"
license = "MIT"
description = "Dual Balanced Ternary Arithmetic"
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ cargo run --example buffer
Notice, current buffer format is not compact, but conceptually:

```text
[magic 3]+[integral length]+[integral pairs]+[fractional pairs]
[integral length]+[integral pairs]+[fractional pairs]
```

since a dbt digits pair takes `81` and `u8` takes `256`, `2/3` of spaces are wasted.
Expand Down
4 changes: 2 additions & 2 deletions examples/buffer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ pub fn main() -> Result<(), String> {
println!("{:?}", ternary("&1.1").to_buffer());
println!("{:?}", ternary("&14.14").to_buffer());

println!("{:?}", DualBalancedTernary::from_buffer(vec![3, 1, 21, 21]));
println!("{:?}", DualBalancedTernary::from_buffer(vec![3, 1, 65, 20]));
println!("{:?}", DualBalancedTernary::from_buffer(vec![1, 21, 21]));
println!("{:?}", DualBalancedTernary::from_buffer(vec![1, 65, 20]));

println!("TODO {:?}", ternary("&12.12").to_buffer()?);

Expand Down
21 changes: 9 additions & 12 deletions src/primes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -390,11 +390,11 @@ impl DualBalancedTernary {
}

/// buffer format
/// [magic 3]+[integral length]+[integral pairs]+[fractional pairs]
/// [integral length]+[integral pairs]+[fractional pairs]
pub fn to_buffer(&self) -> Result<Vec<u8>, String> {
let int_len = self.integral.len();
if int_len < 256 {
let mut buf: Vec<u8> = vec![3, int_len as u8];
let mut buf: Vec<u8> = vec![int_len as u8];
// for integral part, put space 5 at head
let mut halfed = false;
let mut prev: u8 = 0;
Expand All @@ -415,7 +415,7 @@ impl DualBalancedTernary {
}

// expected handled by pair
assert_eq!(buf.len(), ((int_len + 1) >> 1) + 2);
assert_eq!(buf.len(), ((int_len + 1) >> 1) + 1);

// for integral part, put space 5 at tail
for x in &self.fractional {
Expand All @@ -440,30 +440,27 @@ impl DualBalancedTernary {
}

/// buffer format
/// [magic 3]+[integral length]+[integral pairs]+[fractional pairs]
/// [integral length]+[integral pairs]+[fractional pairs]
pub fn from_buffer(buf: Vec<u8>) -> Result<Self, String> {
if buf.len() < 2 {
if buf.is_empty() {
return Err(String::from("dbt buffer expected >=2 u8 numbers"));
}
if buf[0] != 3 {
return Err(String::from("dbt magic number should be 3"));
}

let int_range = (buf[1] + 1) as usize >> 1;
let int_range = (buf[0] + 1) as usize >> 1;

if buf.len() < (int_range + 2) {
if buf.len() < (int_range + 1) {
return Err(String::from("dbt buffer length smaller than integral size"));
}
let mut integral: Vec<DualBalancedTernaryDigit> = vec![];
let mut fractional: Vec<DualBalancedTernaryDigit> = vec![];

// println!("buffer: {:?}", buf);
for (idx, x) in buf.iter().enumerate() {
if idx < 2 {
if idx < 1 {
continue;
}
// println!("reading: {} {}", idx, x);
if idx < (int_range + 2) as usize {
if idx < (int_range + 1) as usize {
integral.push(DualBalancedTernaryDigit::from_u8((x & 0b11110000) >> 4)?);
integral.push(DualBalancedTernaryDigit::from_u8(x & 0b00001111)?);
} else {
Expand Down

0 comments on commit 521d036

Please sign in to comment.