gboolean steal);
static GTreeNode *g_tree_find_node (GTree *tree,
gconstpointer key,
- GTreeSearchType search_type);
+ GTreeSearchType search_type,
+ guint version);
static gint g_tree_node_pre_order (GTreeNode *node,
GTraverseFunc traverse_func,
gpointer data);
static gpointer g_tree_node_search (GTreeNode *node,
GCompareFunc search_func,
gconstpointer data,
- GTreeSearchType search_type);
+ GTreeSearchType search_type,
+ guint version);
static gint g_tree_node_height (GTreeNode *node);
static GTreeNode* g_tree_node_rotate_left (GTree *tree,
GTreeNode *node);
g_return_val_if_fail (tree != NULL, NULL);
- node = g_tree_find_node (tree, key, search_type);
+ node = g_tree_find_node (tree, key, search_type, tree->version);
return node ? node->data->value : NULL;
}
g_return_val_if_fail (tree != NULL, FALSE);
- node = g_tree_find_node (tree, lookup_key, G_TREE_SEARCH_EXACT);
+ node = g_tree_find_node (tree, lookup_key, G_TREE_SEARCH_EXACT, tree->version);
if (node)
{
g_return_val_if_fail (tree != NULL, NULL);
return g_tree_node_search (tree->root(NOW),
- search_func, user_data, search_type);
+ search_func, user_data, search_type,
+ tree->version);
}
static gint
static GTreeNode *
g_tree_find_node (GTree *tree,
gconstpointer key,
- GTreeSearchType search_type)
+ GTreeSearchType search_type,
+ guint version)
{
GTreeNode *node, *remember;
+ GTreeRootVersion *rv;
gint cmp;
- node = tree->root(NOW);
+ rv = g_tree_root_find_version (tree, version);
+ node = rv->root;
if (!node)
return NULL;
return node;
else if (cmp < 0)
{
+ GTreeNodeVersion *nodev = g_tree_node_find_version (node, version);
if (search_type == G_TREE_SEARCH_SUCCESSOR)
remember = node;
- if (!node->left_child(NOW))
+ if (!nodev->left_child)
return remember;
- node = node->left(NOW);
+ node = nodev->left;
}
else
{
+ GTreeNodeVersion *nodev = g_tree_node_find_version (node, version);
if (search_type == G_TREE_SEARCH_PREDECESSOR)
remember = node;
- if (!node->right_child(NOW))
+ if (!nodev->right_child)
return remember;
- node = node->right(NOW);
+ node = nodev->right;
}
}
}
g_tree_node_search (GTreeNode *node,
GCompareFunc search_func,
gconstpointer data,
- GTreeSearchType search_type)
+ GTreeSearchType search_type,
+ guint version)
{
gint dir;
GTreeNode *remember;
return node->data->value;
else if (dir < 0)
{
+ GTreeNodeVersion *nodev = g_tree_node_find_version (node, version);
if (search_type == G_TREE_SEARCH_SUCCESSOR)
remember = node;
- if (!node->left_child(NOW))
+ if (!nodev->left_child)
return remember;
- node = node->left(NOW);
+ node = nodev->left;
}
else
{
+ GTreeNodeVersion *nodev = g_tree_node_find_version (node, version);
if (search_type == G_TREE_SEARCH_PREDECESSOR)
remember = node;
- if (!node->right_child(NOW))
+ if (!nodev->right_child)
return remember;
- node = node->right(NOW);
+ node = nodev->right;
}
}
}