sparse-array: Simplify code slightly.
authorBen Pfaff <blp@gnu.org>
Tue, 5 May 2009 04:53:07 +0000 (21:53 -0700)
committerBen Pfaff <blp@gnu.org>
Sun, 7 Jun 2009 04:11:05 +0000 (21:11 -0700)
Instead of checking whether the key is in range in each caller of
find_leaf_node, do it in find_leaf_node itself.  This also allows checking
the cache before checking whether the key is in range, which might be an
optimization.

src/libpspp/sparse-array.c

index ebc81ff45137734736069abf6eaaa0d13d4b0fae..28398d5cc86321e9e648a9c0ac30c052c1d26641 100644 (file)
@@ -294,12 +294,9 @@ sparse_array_insert (struct sparse_array *spar, unsigned long int key)
 void *
 sparse_array_get (const struct sparse_array *spar, unsigned long int key)
 {
-  if (index_in_range (spar, key))
-    {
-      struct leaf_node *leaf = find_leaf_node (spar, key);
-      if (leaf != NULL && is_in_use (leaf, key))
-        return leaf_element (spar, leaf, key);
-    }
+  struct leaf_node *leaf = find_leaf_node (spar, key);
+  if (leaf != NULL && is_in_use (leaf, key))
+    return leaf_element (spar, leaf, key);
   return NULL;
 }
 
@@ -319,9 +316,6 @@ sparse_array_remove (struct sparse_array *spar, unsigned long int key)
   union pointer *p;
   int level;
 
-  if (!index_in_range (spar, key))
-    return false;
-
   /* Find and free element in leaf. */
   leaf = find_leaf_node (spar, key);
   if (leaf == NULL || !is_in_use (leaf, key))
@@ -587,12 +581,13 @@ find_leaf_node (const struct sparse_array *spar_, unsigned long int key)
   const union pointer *p;
   int level;
 
-  assert (index_in_range (spar, key));
-
   /* Check the cache first. */
   if (key >> BITS_PER_LEVEL == spar->cache_ofs)
     return spar->cache;
 
+  if (!index_in_range (spar, key))
+    return NULL;
+
   /* Descend through internal nodes. */
   p = &spar->root;
   for (level = spar->height - 1; level > 0; level--)