make it so that I can actually run stuff that relies on the solution of exercises
authorRalf Jung <post@ralfj.de>
Wed, 8 Jul 2015 16:06:18 +0000 (18:06 +0200)
committerRalf Jung <post@ralfj.de>
Wed, 8 Jul 2015 16:06:18 +0000 (18:06 +0200)
Makefile
src/main.rs
src/part08.rs
src/part10.rs
workspace/src/part08.rs
workspace/src/part10.rs

index f59d575f8ebac5151e9cff3e4f87c4c52709df82..9b2a818079f9d47d59aa34d0206e49a6f1f83886 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -8,11 +8,12 @@ all: docs workspace crates
 ## Documentation
 docs: $(DOCFILES)
 
-.tmp/docs/%.rs: src/%.rs Makefile
+.tmp/docs/%.rs: src/%.rs Makefile dup-unimpl.sed
        @mkdir -p .tmp/docs
        @echo "$< -> $@"
-       @# sed-fu: remove the "@" from "//@", and remove trailing "/*@*/".
-       @sed 's|^\(\s*//\)@|\1|;s|\s*/\*@\*/$$||' $< > $@
+       @# sed-fu: remove the "@" from "//@", and remove trailing "/*@*/", replace lines ending in  "/*@@*/" by "unimplemented!()".
+       @# Also coalesce multiple adjacent such lines to one.
+       @sed 's|^\(\s*//\)@|\1|;s|\s*/\*@\*/$$||;s|\(\s*\)\S.*/\*@@\*/|\1unimplemented!()|' $< | sed -f dup-unimpl.sed > $@
 
 docs/%.html: .tmp/docs/%.rs
        @./pycco-rs $<
index 40bb1257529dcd45c97f73305fe5f058eb3c524a..d7945a5848eb76220bd296d223c60e979259f14c 100644 (file)
@@ -95,7 +95,7 @@ mod part10;
 // function.
 
 fn main() {
-    part10::main();
+    part00::main();
 }
 
 // Additional material
index feb2abc5a36f7bbee3f81f831ff9499476d27611..2867a588883308914a44474de0fac81ab70039bd 100644 (file)
@@ -26,11 +26,13 @@ fn overflowing_add(a: u64, b: u64, carry: bool) -> (u64, bool) {
     if sum >= a {
         // The addition did not overflow. <br/>
         // **Exercise 08.1**: Write the code to handle adding the carry in this case.
-        unimplemented!()
+        let sum_total = u64::wrapping_add(sum, if carry { 1 } else { 0 });      /*@@*/
+        let had_overflow = sum_total < sum;                                     /*@@*/
+        (sum_total, had_overflow)                                               /*@@*/
     } else {
         // Otherwise, the addition *did* overflow. It is impossible for the addition of the carry
         // to overflow again, as we are just adding 0 or 1.
-        (sum + if carry { 1 } else { 0 }, true)                     /*@*/
+        (sum + if carry { 1 } else { 0 }, true)                                 /*@*/
     }
 }
 
@@ -82,7 +84,10 @@ impl ops::Add<BigInt> for BigInt {
             carry = new_carry;                                                  /*@*/
         }
         // **Exercise 08.2**: Handle the final `carry`, and return the sum.
-        unimplemented!()
+        if carry {                                                              /*@@*/
+            result_vec.push(1);                                                 /*@@*/
+        }                                                                       /*@@*/
+        BigInt { data: result_vec }                                             /*@@*/
     }
 }
 
index 97dd4c124b0924e34adf2cbf9a7780c9d11fddc4..53fb0b300acbc2b2632ecfb90140b2a1d1e144bf 100644 (file)
@@ -28,19 +28,14 @@ impl Action for PrintWithString {
     }
 }
 
-fn read_one_line() -> String {
-    println!("Please enter a line of text.");
-    let mut stdin = io::stdin();
-    let mut prefix = "".to_string();
-    stdin.read_line(&mut prefix).unwrap();
-    prefix
+fn print_with_prefix_v1(b: &BigInt, prefix: String) {
+    let my_action = PrintWithString { prefix: prefix };
+    b.act_v1(my_action);
 }
 
-pub fn main_v1() {
-    let prefix = read_one_line();
-    let my_action = PrintWithString { prefix: prefix };
+pub fn main() {
     let bignum = BigInt::new(1 << 63) + BigInt::new(1 << 16) + BigInt::new(1 << 63);
-    bignum.act_v1(my_action);
+    print_with_prefix_v1(&bignum, "Digit: ".to_string());
 }
 
 impl BigInt {
@@ -51,10 +46,8 @@ impl BigInt {
     }
 }
 
-pub fn main() {
-    let prefix = read_one_line();
-    let bignum = BigInt::new(1 << 63) + BigInt::new(1 << 16) + BigInt::new(1 << 63);
-    bignum.act(|digit| println!("{}{}", prefix, digit) );
+pub fn print_with_prefix(b: &BigInt, prefix: String) {
+    b.act(|digit| println!("{}{}", prefix, digit) );
 }
 
 //@ [index](main.html) | [previous](part08.html) | [next](main.html)
index 61f665f26cb8c5a4af203031536e2367c2d715c1..2d3b5d8f677a58456075d70bf3033470185ab28a 100644 (file)
@@ -13,7 +13,9 @@ fn overflowing_add(a: u64, b: u64, carry: bool) -> (u64, bool) {
     if sum >= a {
         // The addition did not overflow. <br/>
         // **Exercise 08.1**: Write the code to handle adding the carry in this case.
-        unimplemented!()
+        let sum_total = u64::wrapping_add(sum, if carry { 1 } else { 0 });      /*@@*/
+        let had_overflow = sum_total < sum;                                     /*@@*/
+        (sum_total, had_overflow)                                               /*@@*/
     } else {
         // Otherwise, the addition *did* overflow. It is impossible for the addition of the carry
         // to overflow again, as we are just adding 0 or 1.
@@ -52,7 +54,10 @@ impl ops::Add<BigInt> for BigInt {
             unimplemented!()
         }
         // **Exercise 08.2**: Handle the final `carry`, and return the sum.
-        unimplemented!()
+        if carry {                                                              /*@@*/
+            result_vec.push(1);                                                 /*@@*/
+        }                                                                       /*@@*/
+        BigInt { data: result_vec }                                             /*@@*/
     }
 }
 
index ee226c40ec53fffb41219fe78cebca19464461dd..570e8514da545d0499cbe1c7a88b0f3a7bcb2ef0 100644 (file)
@@ -28,19 +28,14 @@ impl Action for PrintWithString {
     }
 }
 
-fn read_one_line() -> String {
-    println!("Please enter a line of text.");
-    let mut stdin = io::stdin();
-    let mut prefix = "".to_string();
-    stdin.read_line(&mut prefix).unwrap();
-    prefix
+fn print_with_prefix_v1(b: &BigInt, prefix: String) {
+    let my_action = PrintWithString { prefix: prefix };
+    b.act_v1(my_action);
 }
 
-pub fn main_v1() {
-    let prefix = read_one_line();
-    let my_action = PrintWithString { prefix: prefix };
+pub fn main() {
     let bignum = BigInt::new(1 << 63) + BigInt::new(1 << 16) + BigInt::new(1 << 63);
-    bignum.act_v1(my_action);
+    print_with_prefix_v1(&bignum, "Digit: ".to_string());
 }
 
 impl BigInt {
@@ -51,9 +46,7 @@ impl BigInt {
     }
 }
 
-pub fn main() {
-    let prefix = read_one_line();
-    let bignum = BigInt::new(1 << 63) + BigInt::new(1 << 16) + BigInt::new(1 << 63);
-    bignum.act(|digit| println!("{}{}", prefix, digit) );
+pub fn print_with_prefix(b: &BigInt, prefix: String) {
+    b.act(|digit| println!("{}{}", prefix, digit) );
 }