diff options
Diffstat (limited to 'cut-n-paste-code')
-rw-r--r-- | cut-n-paste-code/gsequence/gsequence.c | 32 | ||||
-rw-r--r-- | cut-n-paste-code/gsequence/gsequence.h | 5 |
2 files changed, 23 insertions, 14 deletions
diff --git a/cut-n-paste-code/gsequence/gsequence.c b/cut-n-paste-code/gsequence/gsequence.c index 563d4174e..2670d320f 100644 --- a/cut-n-paste-code/gsequence/gsequence.c +++ b/cut-n-paste-code/gsequence/gsequence.c @@ -51,6 +51,7 @@ static GSequenceNode *node_get_by_pos (GSequenceNode *node, gint pos); static GSequenceNode *node_find_closest (GSequenceNode *haystack, GSequenceNode *needle, + GSequenceNode *end, GSequenceIterCompareFunc cmp, gpointer user_data); static gint node_get_length (GSequenceNode *node); @@ -64,6 +65,7 @@ static void node_insert_before (GSequenceNode *node, static void node_unlink (GSequenceNode *node); static void node_insert_sorted (GSequenceNode *node, GSequenceNode *new, + GSequenceNode *end, GSequenceIterCompareFunc cmp_func, gpointer cmp_data); @@ -411,6 +413,7 @@ typedef struct { GCompareDataFunc cmp_func; gpointer cmp_data; + GSequenceNode *end_node; } SortInfo; /* This function compares two iters using a normal compare @@ -424,10 +427,10 @@ iter_compare (GSequenceIter *node1, const SortInfo *info = data; gint retval; - if (is_end (node1)) + if (node1 == info->end_node) return 1; - if (is_end (node2)) + if (node2 == info->end_node) return -1; retval = info->cmp_func (node1->data, node2->data, info->cmp_data); @@ -452,7 +455,7 @@ g_sequence_sort (GSequence *seq, GCompareDataFunc cmp_func, gpointer cmp_data) { - SortInfo info = { cmp_func, cmp_data }; + SortInfo info = { cmp_func, cmp_data, seq->end_node }; check_seq_access (seq); @@ -480,11 +483,12 @@ g_sequence_insert_sorted (GSequence *seq, GCompareDataFunc cmp_func, gpointer cmp_data) { - SortInfo info = { cmp_func, cmp_data }; + SortInfo info = { cmp_func, cmp_data, NULL }; g_return_val_if_fail (seq != NULL, NULL); g_return_val_if_fail (cmp_func != NULL, NULL); + info.end_node = seq->end_node; check_seq_access (seq); return g_sequence_insert_sorted_iter (seq, data, iter_compare, &info); @@ -495,10 +499,11 @@ g_sequence_sort_changed (GSequenceIter *iter, GCompareDataFunc cmp_func, gpointer cmp_data) { - SortInfo info = { cmp_func, cmp_data }; + SortInfo info = { cmp_func, cmp_data, NULL }; g_return_if_fail (!is_end (iter)); + info.end_node = get_sequence (iter)->end_node; check_iter_access (iter); g_sequence_sort_changed_iter (iter, iter_compare, &info); @@ -533,7 +538,7 @@ g_sequence_sort_iter (GSequence *seq, node_unlink (node); - node_insert_sorted (seq->end_node, node, cmp_func, cmp_data); + node_insert_sorted (seq->end_node, node, seq->end_node, cmp_func, cmp_data); } tmp->access_prohibited = FALSE; @@ -558,7 +563,7 @@ g_sequence_sort_changed_iter (GSequenceIter *iter, seq->access_prohibited = TRUE; node_unlink (iter); - node_insert_sorted (seq->end_node, iter, iter_cmp, cmp_data); + node_insert_sorted (seq->end_node, iter, seq->end_node, iter_cmp, cmp_data); seq->access_prohibited = FALSE; } @@ -574,7 +579,7 @@ g_sequence_insert_sorted_iter (GSequence *seq, check_seq_access (seq); new_node = node_new (data); - node_insert_sorted (seq->end_node, new_node, iter_cmp, cmp_data); + node_insert_sorted (seq->end_node, new_node, seq->end_node, iter_cmp, cmp_data); return new_node; } @@ -595,7 +600,7 @@ g_sequence_search_iter (GSequence *seq, dummy = node_new (data); - node = node_find_closest (seq->end_node, dummy, cmp_func, cmp_data); + node = node_find_closest (seq->end_node, dummy, seq->end_node, cmp_func, cmp_data); node_free (dummy, NULL); @@ -624,10 +629,11 @@ g_sequence_search (GSequence *seq, GCompareDataFunc cmp_func, gpointer cmp_data) { - SortInfo info = { cmp_func, cmp_data }; + SortInfo info = { cmp_func, cmp_data, NULL }; g_return_val_if_fail (seq != NULL, NULL); + info.end_node = seq->end_node; check_seq_access (seq); return g_sequence_search_iter (seq, data, iter_compare, &info); @@ -1109,6 +1115,7 @@ node_get_pos (GSequenceNode *node) static GSequenceNode * node_find_closest (GSequenceNode *haystack, GSequenceNode *needle, + GSequenceNode *end, GSequenceIterCompareFunc cmp_func, gpointer cmp_data) { @@ -1123,7 +1130,7 @@ node_find_closest (GSequenceNode *haystack, { best = haystack; - if (is_end (haystack)) + if (haystack == end) c = 1; else c = cmp_func (haystack, needle, cmp_data); @@ -1285,12 +1292,13 @@ node_unlink (GSequenceNode *node) static void node_insert_sorted (GSequenceNode *node, GSequenceNode *new, + GSequenceNode *end, GSequenceIterCompareFunc cmp_func, gpointer cmp_data) { GSequenceNode *closest; - closest = node_find_closest (node, new, cmp_func, cmp_data); + closest = node_find_closest (node, new, end, cmp_func, cmp_data); node_insert_before (closest, new); } diff --git a/cut-n-paste-code/gsequence/gsequence.h b/cut-n-paste-code/gsequence/gsequence.h index 5f6066400..eeac4346e 100644 --- a/cut-n-paste-code/gsequence/gsequence.h +++ b/cut-n-paste-code/gsequence/gsequence.h @@ -26,6 +26,7 @@ typedef struct _GSequence GSequence; typedef struct _GSequenceNode GSequenceIter; + typedef gint (* GSequenceIterCompareFunc) (GSequenceIter *a, GSequenceIter *b, gpointer data); @@ -65,6 +66,8 @@ GSequenceIter *g_sequence_insert_before (GSequenceIter * iter, gpointer data); void g_sequence_move (GSequenceIter * src, GSequenceIter * dest); +void g_sequence_swap (GSequenceIter * a, + GSequenceIter * b); GSequenceIter *g_sequence_insert_sorted (GSequence *seq, gpointer data, GCompareDataFunc cmp_func, @@ -110,8 +113,6 @@ gint g_sequence_iter_get_position (GSequenceIter * iter); GSequenceIter *g_sequence_iter_move (GSequenceIter * iter, gint leap); GSequence * g_sequence_iter_get_sequence (GSequenceIter * iter); -void g_sequence_swap (GSequenceIter *a, - GSequenceIter *b); /* search */ |