struct _GTree
{
- GTreeRoot *roots;
+ GTreeRoot *roots; /* versioned root nodes of the tree. roots[0] is
+ the highest (latest) version. then
+ roots[1]..roots[nroots-1] are
+ older versions in ascending order */
guint nroots;
GCompareDataFunc key_compare;
GDestroyNotify key_destroy_func;
struct _GTreeNode
{
GTreeNodeData *data; /* the node's permanent data */
- GTreeNodeVersion *v; /* versions of pointers for the node, new versions
- * are prepended onto the array so v[0] is the newest
- */
+ GTreeNodeVersion *v; /* versions of pointers for the node. v[0] is the
+ highest (latest) version. then v[1]..v[nv-1] are
+ older versions in ascending order */
guint nv; /* number of versions stored in this node */
};
if (tree->rootversion(NOW) < tree->version)
{
- int i;
-
- /* prepend a new version to the root */
+ /* add a new version of the root */
tree->nroots++;
tree->roots = g_renew(GTreeRoot, tree->roots, tree->nroots);
- for (i = 1; i < tree->nroots; ++i)
- tree->roots[i] = tree->roots[i-1];
- /* roots[0] will be a copy of the latest version */
+ /* copy the latest version from roots[0] */
+ tree->roots[tree->nroots-1] = tree->roots[0];
tree->roots[0].version = tree->version;
-
- // XXX worry about incoming pointers
}
}
g_tree_node_next_version (GTree *tree,
GTreeNode *node)
{
- int i;
-
g_assert(node->version(NOW) <= tree->version);
if (node->version(NOW) == tree->version)
}
else
{
- /* prepend a version to the node's table */
+ /* add a new version to the node's table */
node->nv++;
- for (i = 1; i < node->nv; ++i)
- node->v[i] = node->v[i-1];
- /* v[0] will be a copy of the latest version */
+ /* copy the latest version from v[0] */
+ node->v[node->nv-1] = node->v[0];
node->v[0].version = tree->version;
return node;