Changeset 388 for python/vendor/current/Modules/rotatingtree.c
- Timestamp:
- Mar 19, 2014, 11:11:30 AM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
python/vendor/current/Modules/rotatingtree.c
r2 r388 15 15 randombits(int bits) 16 16 { 17 18 19 20 21 22 23 24 17 int result; 18 if (random_stream < (1U << bits)) { 19 random_value *= 1082527; 20 random_stream = random_value; 21 } 22 result = random_stream & ((1<<bits)-1); 23 random_stream >>= bits; 24 return result; 25 25 } 26 26 … … 31 31 RotatingTree_Add(rotating_node_t **root, rotating_node_t *node) 32 32 { 33 34 35 36 37 38 39 40 41 33 while (*root != NULL) { 34 if (KEY_LOWER_THAN(node->key, (*root)->key)) 35 root = &((*root)->left); 36 else 37 root = &((*root)->right); 38 } 39 node->left = NULL; 40 node->right = NULL; 41 *root = node; 42 42 } 43 43 … … 48 48 RotatingTree_Get(rotating_node_t **root, void *key) 49 49 { 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 50 if (randombits(3) != 4) { 51 /* Fast path, no rebalancing */ 52 rotating_node_t *node = *root; 53 while (node != NULL) { 54 if (node->key == key) 55 return node; 56 if (KEY_LOWER_THAN(key, node->key)) 57 node = node->left; 58 else 59 node = node->right; 60 } 61 return NULL; 62 } 63 else { 64 rotating_node_t **pnode = root; 65 rotating_node_t *node = *pnode; 66 rotating_node_t *next; 67 int rotate; 68 if (node == NULL) 69 return NULL; 70 while (1) { 71 if (node->key == key) 72 return node; 73 rotate = !randombits(1); 74 if (KEY_LOWER_THAN(key, node->key)) { 75 next = node->left; 76 if (next == NULL) 77 return NULL; 78 if (rotate) { 79 node->left = next->right; 80 next->right = node; 81 *pnode = next; 82 } 83 else 84 pnode = &(node->left); 85 } 86 else { 87 next = node->right; 88 if (next == NULL) 89 return NULL; 90 if (rotate) { 91 node->right = next->left; 92 next->left = node; 93 *pnode = next; 94 } 95 else 96 pnode = &(node->right); 97 } 98 node = next; 99 } 100 } 101 101 } 102 102 … … 106 106 int 107 107 RotatingTree_Enum(rotating_node_t *root, rotating_tree_enum_fn enumfn, 108 108 void *arg) 109 109 { 110 111 112 113 114 115 116 117 118 119 120 110 int result; 111 rotating_node_t *node; 112 while (root != NULL) { 113 result = RotatingTree_Enum(root->left, enumfn, arg); 114 if (result != 0) return result; 115 node = root->right; 116 result = enumfn(root, arg); 117 if (result != 0) return result; 118 root = node; 119 } 120 return 0; 121 121 }
Note:
See TracChangeset
for help on using the changeset viewer.