isl_tab: support generic undo records
authorSven Verdoolaege <skimo@kotnet.org>
Fri, 16 Oct 2009 12:30:24 +0000 (14:30 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Fri, 16 Oct 2009 12:30:24 +0000 (14:30 +0200)
isl_tab.c
isl_tab.h

index c09b6cb..0316a73 100644 (file)
--- a/isl_tab.c
+++ b/isl_tab.c
@@ -799,6 +799,13 @@ int isl_tab_push_basis(struct isl_tab *tab)
        return push_union(tab, isl_tab_undo_saved_basis, u);
 }
 
+int isl_tab_push_callback(struct isl_tab *tab, struct isl_tab_callback *callback)
+{
+       union isl_tab_undo_val u;
+       u.callback = callback;
+       return push_union(tab, isl_tab_undo_callback, u);
+}
+
 struct isl_tab *isl_tab_init_samples(struct isl_tab *tab)
 {
        if (!tab)
@@ -2755,6 +2762,8 @@ static int perform_undo(struct isl_tab *tab, struct isl_tab_undo *undo)
        case isl_tab_undo_saved_samples:
                drop_samples_since(tab, undo->u.n);
                break;
+       case isl_tab_undo_callback:
+               return undo->u.callback->run(undo->u.callback);
        default:
                isl_assert(tab->mat->ctx, 0, return -1);
        }
index 5036273..13919cf 100644 (file)
--- a/isl_tab.h
+++ b/isl_tab.h
@@ -31,12 +31,18 @@ enum isl_tab_undo_type {
        isl_tab_undo_saved_basis,
        isl_tab_undo_drop_sample,
        isl_tab_undo_saved_samples,
+       isl_tab_undo_callback,
+};
+
+struct isl_tab_callback {
+       int (*run)(struct isl_tab_callback *cb);
 };
 
 union isl_tab_undo_val {
        int             var_index;
        int             *col_var;
        int             n;
+       struct isl_tab_callback *callback;
 };
 
 struct isl_tab_undo {
@@ -237,4 +243,7 @@ int isl_tab_save_samples(struct isl_tab *tab) WARN_UNUSED;
 struct isl_tab *isl_tab_detect_equalities(struct isl_tab *tab,
        struct isl_tab *tab_cone) WARN_UNUSED;
 
+int isl_tab_push_callback(struct isl_tab *tab,
+       struct isl_tab_callback *callback) WARN_UNUSED;
+
 #endif