move logic for obvious corner cases to intsetSearch
authorPieter Noordhuis <pcnoordhuis@gmail.com>
Thu, 3 Jun 2010 20:21:39 +0000 (22:21 +0200)
committerPieter Noordhuis <pcnoordhuis@gmail.com>
Fri, 11 Jun 2010 13:07:24 +0000 (15:07 +0200)
intset.c

index 8ffaef259f949bf708d4329eb34986708d872e2d..f1bbcde321eb795ae512c7bfc5c8f88a3d8f56e2 100644 (file)
--- a/intset.c
+++ b/intset.c
@@ -68,6 +68,16 @@ static uint8_t intsetSearch(intset *is, int64_t value, uint32_t *pos) {
     if (is->length == 0) {
         if (pos) *pos = 0;
         return 0;
+    } else {
+        /* Check for the case where we know we cannot find the value,
+         * but do know the insert position. */
+        if (value > INTSET_GET(is,is->length-1)) {
+            if (pos) *pos = is->length;
+            return 0;
+        } else if (value < INTSET_GET(is,0)) {
+            if (pos) *pos = 0;
+            return 0;
+        }
     }
 
     while(max >= min) {
@@ -124,21 +134,12 @@ intset *intsetAdd(intset *is, int64_t value, uint8_t *success) {
         is = intsetUpgrade(is,valenc,1,offset);
         pos = (value < 0) ? 0 : is->length;
     } else {
-        if (is->length == 0) {
-            pos = 0;
-        } else {
-            /* Check for the case where we know the insert position */
-            if (value > INTSET_GET(is,is->length-1)) {
-                pos = is->length;
-            } else if (value < INTSET_GET(is,0)) {
-                pos = 0;
-            } else {
-                /* Abort if the value is already present in the set */
-                if (intsetSearch(is,value,&pos)) {
-                    if (success) *success = 0;
-                    return is;
-                }
-            }
+        /* Abort if the value is already present in the set.
+         * This call will populate "pos" with the right position to insert
+         * the value when it cannot be found. */
+        if (intsetSearch(is,value,&pos)) {
+            if (success) *success = 0;
+            return is;
         }
 
         is = intsetResize(is,is->length+1);