00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef CUEX_SSFN_H
00019 #define CUEX_SSFN_H
00020
00021 #include <cuex/fwd.h>
00022 #include <cucon/pmap.h>
00023 #include <cucon/rbtree.h>
00024 #include <cucon/stack.h>
00025 #include <cuex/pvar.h>
00026
00027 CU_BEGIN_DECLARATIONS
00028
00029
00030
00031
00032
00033
00034 typedef struct cuex_ssfn_node *cuex_ssfn_node_t;
00035 typedef struct cuex_ssfn *cuex_ssfn_t;
00036 typedef unsigned long cuex_ssfn_seqno_t;
00037
00038 struct cuex_ssfn_node
00039 {
00040
00041 struct cucon_pmap match_exaddr;
00042 struct cucon_umap match_opr;
00043
00044
00045
00046
00047 cuex_qcode_t var_qcode;
00048 cuex_ssfn_node_t var_cntn;
00049
00050 cuex_ssfn_seqno_t seqno;
00051 };
00052
00053 struct cuex_ssfn
00054 {
00055 cu_inherit (cuex_ssfn_node);
00056 };
00057
00058
00059
00060 typedef enum {
00061 cuex_ssfn_ctrl_unmatched = 0,
00062 cuex_ssfn_ctrl_cont_delete = 1,
00063 cuex_ssfn_ctrl_continue = 2,
00064 cuex_ssfn_ctrl_cut_mg = 4,
00065 cuex_ssfn_ctrl_commit = 6,
00066 cuex_ssfn_ctrl_fail = 8,
00067 } cuex_ssfn_ctrl_t;
00068 #define cuex_ssfn_ctrl_do_delete(ctrl) ((ctrl) & 1)
00069 #define cuex_ssfn_ctrl_do_cont(ctrl) ((ctrl) <= cuex_ssfn_ctrl_cut_mg)
00070
00071
00072 void cuex_ssfn_cct(cuex_ssfn_t ssfn);
00073 cuex_ssfn_t cuex_ssfn_new(void);
00074
00075
00076 void cuex_ssfn_dct(cuex_ssfn_t ssfn);
00077
00078 void cuex_ssfn_cct_copy_mem(cuex_ssfn_t dst, cuex_ssfn_t src,
00079 size_t slot_size,
00080 cu_clop(slot_cct_copy, void, void *, void *));
00081 cuex_ssfn_t
00082 cuex_ssfn_new_copy_mem(cuex_ssfn_t src,
00083 size_t slot_size,
00084 cu_clop(slot_cct_copy, void, void *, void *));
00085
00086
00087
00088
00089
00090
00091
00092 cu_bool_t cuex_ssfn_insert_mem(cuex_ssfn_t ssfn, cuex_t patn,
00093 cuex_ssfn_seqno_t seqno,
00094 size_t slot_size, cu_ptr_ptr_t slot_o,
00095 cu_count_t *var_cnt_o, cuex_var_t **var_arr_o);
00096
00097
00098
00099
00100
00101
00102 void cuex_ssfn_find(cuex_ssfn_t ssfn, cuex_t key,
00103 cu_clop(out, cu_bool_t, cu_count_t arg_cnt,
00104 cuex_t *arg_arr, void *slot));
00105
00106 void
00107 cuex_ssfn_intersection_find_aux(
00108 cuex_ssfn_t ssfn_first,
00109 cucon_list_t ssfn_list,
00110 cuex_t key,
00111 cu_clop(out, cu_bool_t, cu_count_t arg_cnt, cuex_t *arg_arr, void *slot));
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 typedef struct cuex_ssfn_matchinfo *cuex_ssfn_matchinfo_t;
00126 struct cuex_ssfn_matchinfo
00127 {
00128 cu_bool_t is_wp;
00129 };
00130
00131
00132 typedef cu_clop(cuex_ssfn_find_cb_t,
00133 cuex_ssfn_ctrl_t,
00134 void *slot, cuex_subst_t subst,
00135 cu_rank_t pat_arg_cnt, cuex_t *pat_arg_arr,
00136 cuex_ssfn_matchinfo_t mi);
00137 cuex_ssfn_ctrl_t cuex_ssfn_find_mgu(cuex_ssfn_t ssfn, cuex_subst_t subst,
00138 cuex_t key, cuex_ssfn_seqno_t seqno,
00139 cuex_ssfn_find_cb_t cb);
00140 cuex_ssfn_ctrl_t cuex_ssfn_find_wpmgu(cuex_ssfn_t ssfn, cuex_subst_t subst,
00141 cuex_t key, cuex_ssfn_seqno_t seqno,
00142 cuex_ssfn_find_cb_t cb);
00143 cuex_ssfn_ctrl_t cuex_ssfn_find_lgr(cuex_ssfn_t ssfn, cuex_subst_t subst,
00144 cuex_t key, cuex_ssfn_seqno_t seqno,
00145 cuex_ssfn_find_cb_t cb);
00146 cuex_ssfn_ctrl_t cuex_ssfn_find_mgr(cuex_ssfn_t ssfn, cuex_subst_t subst,
00147 cuex_t key, cuex_ssfn_seqno_t seqno,
00148 cuex_ssfn_find_cb_t cb);
00149 cuex_ssfn_ctrl_t cuex_ssfn_find_wpmgr(cuex_ssfn_t ssfn, cuex_subst_t subst,
00150 cuex_t key, cuex_ssfn_seqno_t seqno,
00151 cuex_ssfn_find_cb_t cb);
00152 cuex_ssfn_ctrl_t cuex_ssfn_find_eqr(cuex_ssfn_t ssfn, cuex_t key,
00153 cu_clop(cb, cuex_ssfn_ctrl_t, void *slot));
00154
00155
00156
00157
00158
00159 cu_bool_t cuex_ssfn_have_wpmgu(cuex_ssfn_t ssfn, cuex_subst_t subst,
00160 cuex_t key, cuex_ssfn_seqno_t seqno);
00161 cu_bool_t cuex_ssfn_have_wpmgr(cuex_ssfn_t ssfn, cuex_subst_t subst,
00162 cuex_t key, cuex_ssfn_seqno_t seqno);
00163
00164 void cuex_ssfn_erase_lgr(cuex_ssfn_t ssfn, cuex_t key);
00165 void cuex_ssfn_erase_mgr(cuex_ssfn_t ssfn, cuex_t key);
00166 void cuex_ssfn_erase_wpmgr(cuex_ssfn_t ssfn, cuex_t key);
00167
00168 void *cuex_ssfn_find_single_wpmgr(cuex_ssfn_t ssfn, cuex_subst_t subst,
00169 cuex_t key);
00170
00171 void cuex_ssfn_dump_keys(cuex_ssfn_t ssfn, FILE *out);
00172
00173
00174
00175
00176
00177 typedef struct cuex_ssfn_find_it *cuex_ssfn_find_it_t;
00178 typedef struct cuexP_ssfn_find_jargs {
00179 struct cucon_stack input;
00180 struct cucon_stack output;
00181 struct cucon_stack sctr;
00182 int *sctr_most_specific;
00183 cu_clop(receiver, cu_bool_t, cu_count_t arg_cnt, cuex_t *arg_arr, void *);
00184 cu_count_t arg_cnt;
00185 } *cuexP_ssfn_find_jargs_t;
00186 struct cuex_ssfn_find_it
00187 {
00188 struct cucon_stack stack;
00189 struct cuexP_ssfn_find_jargs jargs;
00190 void *slot;
00191 cu_count_t arg_cnt;
00192 cuex_t *arg_arr;
00193 int *sctr_this;
00194 };
00195
00196
00197 void cuex_ssfn_find_it_cct(cuex_ssfn_find_it_t it, cuex_ssfn_t ssfn, cuex_t);
00198 cuex_ssfn_find_it_t cuex_ssfn_find_it_new(cuex_ssfn_t ssfn, cuex_t key);
00199
00200
00201 void cuex_ssfn_find_it_advance(cuex_ssfn_find_it_t it);
00202
00203
00204 #define cuex_ssfn_find_it_is_end(it) \
00205 (CU_MARG(cuex_ssfn_find_it_t, it)->slot == NULL)
00206
00207
00208
00209 void cuex_ssfn_find_it_report_match(cuex_ssfn_find_it_t it);
00210
00211
00212 #define cuex_ssfn_find_it_arg_cnt(it) \
00213 (CU_MARG(cuex_ssfn_find_it_t, it)->arg_cnt)
00214 #define cuex_ssfn_find_it_arg_arr(it) \
00215 (CU_MARG(cuex_ssfn_find_it_t, it)->arg_arr)
00216
00217
00218 #define cuex_ssfn_find_it_slot(it) \
00219 (CU_MARG(cuex_ssfn_find_it_t, it)->slot)
00220
00221
00222
00223
00224
00225
00226 cu_bool_t cuex_ssfn_find_it_match_lgr(cuex_ssfn_find_it_t it0,
00227 cuex_ssfn_find_it_t it1);
00228
00229
00230 CU_END_DECLARATIONS
00231
00232 #endif