At present, diffcore_order() interface is to accept only queue of
`struct diff_filepair`.

In the next patches, we'll need to order `struct combine_diff_path` by path,
so let's first rework diffcore-order to also provide generic low-level
interface for ordering arbitrary objects, provided they have path accessors.

The new interface is:

    - `struct obj_order`    for describing objects to ordering routine, and
    - order_objects()       for actually doing the ordering work.

Signed-off-by: Kirill Smelkov <k...@mns.spb.ru>
---
 diffcore-order.c | 53 +++++++++++++++++++++++++++++++++++------------------
 diffcore.h       | 15 +++++++++++++++
 2 files changed, 50 insertions(+), 18 deletions(-)

diff --git a/diffcore-order.c b/diffcore-order.c
index fe7f1f4..327a93e 100644
--- a/diffcore-order.c
+++ b/diffcore-order.c
@@ -57,11 +57,7 @@ static void prepare_order(const char *orderfile)
        }
 }
 
-struct pair_order {
-       struct diff_filepair *pair;
-       int orig_order;
-       int order;
-};
+
 
 static int match_order(const char *path)
 {
@@ -84,35 +80,56 @@ static int match_order(const char *path)
        return order_cnt;
 }
 
-static int compare_pair_order(const void *a_, const void *b_)
+static int compare_objs_order(const void *a_, const void *b_)
 {
-       struct pair_order const *a, *b;
-       a = (struct pair_order const *)a_;
-       b = (struct pair_order const *)b_;
+       struct obj_order const *a, *b;
+       a = (struct obj_order const *)a_;
+       b = (struct obj_order const *)b_;
        if (a->order != b->order)
                return a->order - b->order;
        return a->orig_order - b->orig_order;
 }
 
+
+void order_objects(const char *orderfile, obj_path_fn_t obj_path,
+                       struct obj_order *objs, int nr)
+{
+       int i;
+
+       if (!nr)
+               return;
+
+       prepare_order(orderfile);
+       for (i = 0; i < nr; i++) {
+               objs[i].orig_order = i;
+               objs[i].order = match_order(obj_path(objs[i].obj));
+       }
+       qsort(objs, nr, sizeof(*objs), compare_objs_order);
+}
+
+
+static const char *pair_pathtwo(void *obj)
+{
+       struct diff_filepair *pair = (struct diff_filepair *)obj;
+
+       return pair->two->path;
+}
+
 void diffcore_order(const char *orderfile)
 {
        struct diff_queue_struct *q = &diff_queued_diff;
-       struct pair_order *o;
+       struct obj_order *o;
        int i;
 
        if (!q->nr)
                return;
 
        o = xmalloc(sizeof(*o) * q->nr);
-       prepare_order(orderfile);
-       for (i = 0; i < q->nr; i++) {
-               o[i].pair = q->queue[i];
-               o[i].orig_order = i;
-               o[i].order = match_order(o[i].pair->two->path);
-       }
-       qsort(o, q->nr, sizeof(*o), compare_pair_order);
        for (i = 0; i < q->nr; i++)
-               q->queue[i] = o[i].pair;
+               o[i].obj = q->queue[i];
+       order_objects(orderfile, pair_pathtwo, o, q->nr);
+       for (i = 0; i < q->nr; i++)
+               q->queue[i] = o[i].obj;
        free(o);
        return;
 }
diff --git a/diffcore.h b/diffcore.h
index 1c16c85..1fd00fc 100644
--- a/diffcore.h
+++ b/diffcore.h
@@ -111,6 +111,21 @@ extern void diffcore_merge_broken(void);
 extern void diffcore_pickaxe(struct diff_options *);
 extern void diffcore_order(const char *orderfile);
 
+/* low-level interface to diffcore_order */
+struct obj_order {
+       void *obj;      /* setup by caller */
+
+       /* setup/used by order_objects() */
+       int orig_order;
+       int order;
+};
+
+typedef const char *(*obj_path_fn_t)(void *obj);
+
+void order_objects(const char *orderfile, obj_path_fn_t obj_path,
+                       struct obj_order *objs, int nr);
+
+
 #define DIFF_DEBUG 0
 #if DIFF_DEBUG
 void diff_debug_filespec(struct diff_filespec *, int, const char *);
-- 
1.9.rc0.143.g6fd479e

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to