about summary refs log tree commit diff stats
path: root/024compare.cc
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-05-12 13:10:23 -0700
committerKartik K. Agaram <vc@akkartik.com>2015-05-12 17:00:19 -0700
commit3663ca6c2d4c42c4a7bf6af4b2edf71dd8d10dd7 (patch)
tree330d04974b9d30bff1b16adc8d14a3d9fd77643d /024compare.cc
parenta70d593dfb8eea87a898a69adeb9689a21199edf (diff)
downloadmu-3663ca6c2d4c42c4a7bf6af4b2edf71dd8d10dd7.tar.gz
1356 - snapshot #2: floating point support
I added one test to check that divide can return a float, then hacked at
the rippling failures across the entire entire codebase until all tests
pass. Now I need to look at the changes I made and see if there's a
system to them, identify other places that I missed, and figure out the
best way to cover all cases. I also need to show real rather than
encoded values in the traces, but I can't use value() inside reagent
methods because of the name clash with the member variable. So let's
take a snapshot before we attempt any refactoring. This was non-trivial
to get right.

Even if I convince myself that I've gotten it right, I might back this
all out if I can't easily *persuade others* that I've gotten it right.
Diffstat (limited to '024compare.cc')
-rw-r--r--024compare.cc30
1 files changed, 20 insertions, 10 deletions
diff --git a/024compare.cc b/024compare.cc
index 92d87e5c..c9d73170 100644
--- a/024compare.cc
+++ b/024compare.cc
@@ -9,13 +9,23 @@ case EQUAL: {
   vector<long long int>& exemplar = ingredients.at(0);
   bool result = true;
   for (index_t i = 1; i < ingredients.size(); ++i) {
-    if (!equal(ingredients.at(i).begin(), ingredients.at(i).end(), exemplar.begin())) {
+//?     cerr << ingredients.at(i).at(0) << " <=> " << exemplar.at(0) << '\n'; //? 1
+//?     cerr << value(ingredients.at(i).at(0)) << " <=> " << value(exemplar.at(0)) << '\n'; //? 1
+    if (ingredients.at(i).size() != exemplar.size()) {
       result = false;
       break;
     }
+//?     if (!equal(ingredients.at(i).begin(), ingredients.at(i).end(), exemplar.begin()))
+    for (index_t j = 0; j < exemplar.size(); ++j) {
+      if (value(ingredients.at(i).at(j)) != value(exemplar.at(j))) {
+        result = false;
+        goto finish;
+      }
+    }
   }
+  finish:
   products.resize(1);
-  products.at(0).push_back(result);
+  products.at(0).push_back(result);  // boolean must be a positive integer
   break;
 }
 
@@ -70,12 +80,12 @@ case GREATER_THAN: {
     assert(ingredients.at(i).size() == 1);  // scalar
   }
   for (index_t i = /**/1; i < ingredients.size(); ++i) {
-    if (ingredients.at(i-1).at(0) <= ingredients.at(i).at(0)) {
+    if (value(ingredients.at(i-1).at(0)) <= value(ingredients.at(i).at(0))) {
       result = false;
     }
   }
   products.resize(1);
-  products.at(0).push_back(result);
+  products.at(0).push_back(result);  // boolean must be a positive integer
   break;
 }
 
@@ -130,12 +140,12 @@ case LESSER_THAN: {
     assert(ingredients.at(i).size() == 1);  // scalar
   }
   for (index_t i = /**/1; i < ingredients.size(); ++i) {
-    if (ingredients.at(i-1).at(0) >= ingredients.at(i).at(0)) {
+    if (value(ingredients.at(i-1).at(0)) >= value(ingredients.at(i).at(0))) {
       result = false;
     }
   }
   products.resize(1);
-  products.at(0).push_back(result);
+  products.at(0).push_back(result);  // boolean must be a positive integer
   break;
 }
 
@@ -190,12 +200,12 @@ case GREATER_OR_EQUAL: {
     assert(ingredients.at(i).size() == 1);  // scalar
   }
   for (index_t i = /**/1; i < ingredients.size(); ++i) {
-    if (ingredients.at(i-1).at(0) < ingredients.at(i).at(0)) {
+    if (value(ingredients.at(i-1).at(0)) < value(ingredients.at(i).at(0))) {
       result = false;
     }
   }
   products.resize(1);
-  products.at(0).push_back(result);
+  products.at(0).push_back(result);  // boolean must be a positive integer
   break;
 }
 
@@ -264,12 +274,12 @@ case LESSER_OR_EQUAL: {
     assert(ingredients.at(i).size() == 1);  // scalar
   }
   for (index_t i = /**/1; i < ingredients.size(); ++i) {
-    if (ingredients.at(i-1).at(0) > ingredients.at(i).at(0)) {
+    if (value(ingredients.at(i-1).at(0)) > value(ingredients.at(i).at(0))) {
       result = false;
     }
   }
   products.resize(1);
-  products.at(0).push_back(result);
+  products.at(0).push_back(result);  // boolean must be a positive integer
   break;
 }