Explorar el Código

structure: CAvl: add option to not have lookup operations

ambrop7 hace 13 años
padre
commit
c14d248662

+ 1 - 0
ncd/NCDVal_maptree.h

@@ -1,6 +1,7 @@
 #define CAVL_PARAM_NAME NCDVal__MapTree
 #define CAVL_PARAM_FEATURE_COUNTS 0
 #define CAVL_PARAM_FEATURE_KEYS_ARE_INDICES 0
+#define CAVL_PARAM_FEATURE_NOKEYS 0
 #define CAVL_PARAM_TYPE_ENTRY NCDVal__maptree_entry
 #define CAVL_PARAM_TYPE_LINK NCDVal__idx
 #define CAVL_PARAM_TYPE_KEY NCDValRef

+ 1 - 0
ncd/NCDValue_maptree.h

@@ -1,6 +1,7 @@
 #define CAVL_PARAM_NAME NCDValue__MapTree
 #define CAVL_PARAM_FEATURE_COUNTS 0
 #define CAVL_PARAM_FEATURE_KEYS_ARE_INDICES 0
+#define CAVL_PARAM_FEATURE_NOKEYS 0
 #define CAVL_PARAM_TYPE_ENTRY NCDMapElement
 #define CAVL_PARAM_TYPE_LINK NCDValue__maptree_link
 #define CAVL_PARAM_TYPE_KEY NCDValue__maptree_key

+ 1 - 1
structure/CAvl_decl.h

@@ -49,7 +49,7 @@ static int CAvl_Insert (CAvl *o, CAvlArg arg, CAvlRef node, CAvlRef *out_ref);
 static void CAvl_InsertAt (CAvl *o, CAvlArg arg, CAvlRef node, CAvlCount index);
 #endif
 static void CAvl_Remove (CAvl *o, CAvlArg arg, CAvlRef node);
-#if !CAVL_PARAM_FEATURE_KEYS_ARE_INDICES
+#if !CAVL_PARAM_FEATURE_KEYS_ARE_INDICES && !CAVL_PARAM_FEATURE_NOKEYS
 static CAvlRef CAvl_Lookup (const CAvl *o, CAvlArg arg, CAvlKey key);
 static CAvlRef CAvl_LookupExact (const CAvl *o, CAvlArg arg, CAvlKey key);
 #endif

+ 1 - 0
structure/CAvl_footer.h

@@ -30,6 +30,7 @@
 #undef CAVL_PARAM_NAME
 #undef CAVL_PARAM_FEATURE_COUNTS
 #undef CAVL_PARAM_FEATURE_KEYS_ARE_INDICES
+#undef CAVL_PARAM_FEATURE_NOKEYS
 #undef CAVL_PARAM_TYPE_ENTRY
 #undef CAVL_PARAM_TYPE_LINK
 #undef CAVL_PARAM_TYPE_KEY

+ 7 - 1
structure/CAvl_header.h

@@ -33,9 +33,11 @@
 // CAVL_PARAM_FEATURE_KEYS_ARE_INDICES - (0 or 1) whether to assume the keys are entry indices
 //   (number of entries lesser than given entry). If yes, CAVL_PARAM_TYPE_KEY is unused.
 //   Requires CAVL_PARAM_FEATURE_COUNTS.
+// CAVL_PARAM_FEATURE_NOKEYS - define to 1 if there is no need for a lookup operation
 // CAVL_PARAM_TYPE_ENTRY - type of entry
 // CAVL_PARAM_TYPE_LINK - type of entry link (usually pointer or index)
-// CAVL_PARAM_TYPE_KEY - type of key (only if not CAVL_PARAM_FEATURE_KEYS_ARE_INDICES)
+// CAVL_PARAM_TYPE_KEY - type of key (only if not CAVL_PARAM_FEATURE_KEYS_ARE_INDICES and
+//   not CAVL_PARAM_FEATURE_NOKEYS)
 // CAVL_PARAM_TYPE_ARG - type of argument pass through to callbacks
 // CAVL_PARAM_TYPE_COUNT - type of count (only if CAVL_PARAM_FEATURE_COUNTS)
 // CAVL_PARAM_VALUE_COUNT_MAX - maximum value of count (type is CAVL_PARAM_TYPE_COUNT)
@@ -53,6 +55,10 @@
 #error CAVL_PARAM_FEATURE_KEYS_ARE_INDICES requires CAVL_PARAM_FEATURE_COUNTS
 #endif
 
+#if CAVL_PARAM_FEATURE_KEYS_ARE_INDICES && CAVL_PARAM_FEATURE_NOKEYS
+#error CAVL_PARAM_FEATURE_KEYS_ARE_INDICES and CAVL_PARAM_FEATURE_NOKEYS cannot be used together
+#endif
+
 // types
 #define CAvl CAVL_PARAM_NAME
 #define CAvlEntry CAVL_PARAM_TYPE_ENTRY

+ 5 - 1
structure/CAvl_impl.h

@@ -53,6 +53,8 @@ static int CAvl_compare_entries (CAvlArg arg, CAvlRef node1, CAvlRef node2)
     return res;
 }
 
+#if !CAVL_PARAM_FEATURE_NOKEYS
+
 static int CAvl_compare_key_entry (CAvlArg arg, CAvlKey key1, CAvlRef node2)
 {
     int res = CAVL_PARAM_FUN_COMPARE_KEY_ENTRY(arg, key1, node2);
@@ -64,6 +66,8 @@ static int CAvl_compare_key_entry (CAvlArg arg, CAvlKey key1, CAvlRef node2)
 
 #endif
 
+#endif
+
 static int CAvl_check_parent (CAvlRef p, CAvlRef c)
 {
     return (p.link == CAvl_parent(c)) && (p.link == CAvl_nulllink() || c.link == CAvl_link(p)[0] || c.link == CAvl_link(p)[1]);
@@ -574,7 +578,7 @@ static void CAvl_Remove (CAvl *o, CAvlArg arg, CAvlRef node)
     CAvl_assert_tree(o, arg);
 }
 
-#if !CAVL_PARAM_FEATURE_KEYS_ARE_INDICES
+#if !CAVL_PARAM_FEATURE_KEYS_ARE_INDICES && !CAVL_PARAM_FEATURE_NOKEYS
 
 static CAvlRef CAvl_Lookup (const CAvl *o, CAvlArg arg, CAvlKey key)
 {

+ 1 - 0
structure/IndexedList_tree.h

@@ -1,6 +1,7 @@
 #define CAVL_PARAM_NAME IndexedList__Tree
 #define CAVL_PARAM_FEATURE_COUNTS 1
 #define CAVL_PARAM_FEATURE_KEYS_ARE_INDICES 1
+#define CAVL_PARAM_FEATURE_NOKEYS 0
 #define CAVL_PARAM_TYPE_ENTRY IndexedListNode
 #define CAVL_PARAM_TYPE_LINK IndexedList__tree_link
 #define CAVL_PARAM_TYPE_ARG int