_ctx ctx; \
} _name
+#define total_order_cmp(_order, _a, _b) \
+ ((_order).cb((_a), (_b), (_order).ctx))
+
#define _DECL_ONAME(_oname, _itype) \
extern int _order_##_oname(const void *, const void *, void *); \
extern int order_##_oname(const _itype *, const _itype *, void *); \
--- /dev/null
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <ccan/order/order.h>
+
+#include <ccan/tap/tap.h>
+
+#include "fancy_cmp.h"
+
+int main(int argc, char *argv[])
+{
+ struct item item1 = {
+ .value = 0,
+ .str = "aaa",
+ };
+ struct item item2 = {
+ .value = 0,
+ .str = "abb",
+ };
+ struct item item3 = {
+ .value = 0x1000,
+ .str = "baa",
+ };
+ struct cmp_info ctx1 = {
+ .xcode = 0,
+ .offset = 0,
+ };
+ struct cmp_info ctx2 = {
+ .xcode = 0x1000,
+ .offset = 1,
+ };
+ total_order(order1, struct item, struct cmp_info *) = {
+ fancy_cmp, &ctx1,
+ };
+ total_order(order2, struct item, struct cmp_info *) = {
+ fancy_cmp, &ctx2,
+ };
+
+ plan_tests(18);
+
+ ok1(total_order_cmp(order1, &item1, &item1) == 0);
+ ok1(total_order_cmp(order1, &item2, &item2) == 0);
+ ok1(total_order_cmp(order1, &item3, &item3) == 0);
+
+ ok1(total_order_cmp(order1, &item1, &item2) == -1);
+ ok1(total_order_cmp(order1, &item2, &item3) == -1);
+ ok1(total_order_cmp(order1, &item1, &item3) == -1);
+
+ ok1(total_order_cmp(order1, &item2, &item1) == 1);
+ ok1(total_order_cmp(order1, &item3, &item2) == 1);
+ ok1(total_order_cmp(order1, &item3, &item1) == 1);
+
+
+ ok1(total_order_cmp(order2, &item1, &item1) == 0);
+ ok1(total_order_cmp(order2, &item2, &item2) == 0);
+ ok1(total_order_cmp(order2, &item3, &item3) == 0);
+
+ ok1(total_order_cmp(order2, &item1, &item2) == 1);
+ ok1(total_order_cmp(order2, &item2, &item3) == 1);
+ ok1(total_order_cmp(order2, &item1, &item3) == 1);
+
+ ok1(total_order_cmp(order2, &item2, &item1) == -1);
+ ok1(total_order_cmp(order2, &item3, &item2) == -1);
+ ok1(total_order_cmp(order2, &item3, &item1) == -1);
+
+ exit(0);
+}