00001 #ifndef SPARSE_H
00002 #define SPARSE_H
00003
00004 #include "util.h"
00005
00006
00007 #define sm_alloc sm_allocate
00008 #define sm_free sm_free_space
00009
00010
00011
00012
00013
00014 typedef struct sm_element_struct sm_element;
00015 typedef struct sm_row_struct sm_row;
00016 typedef struct sm_col_struct sm_col;
00017 typedef struct sm_matrix_struct sm_matrix;
00018
00019
00020
00021
00022
00023 struct sm_element_struct {
00024 int row_num;
00025 int col_num;
00026 sm_element *next_row;
00027 sm_element *prev_row;
00028 sm_element *next_col;
00029 sm_element *prev_col;
00030 char *user_word;
00031 };
00032
00033
00034
00035
00036
00037 struct sm_row_struct {
00038 int row_num;
00039 int length;
00040 int flag;
00041 sm_element *first_col;
00042 sm_element *last_col;
00043 sm_row *next_row;
00044 sm_row *prev_row;
00045 char *user_word;
00046 };
00047
00048
00049
00050
00051
00052 struct sm_col_struct {
00053 int col_num;
00054 int length;
00055 int flag;
00056 sm_element *first_row;
00057 sm_element *last_row;
00058 sm_col *next_col;
00059 sm_col *prev_col;
00060 char *user_word;
00061 };
00062
00063
00064
00065
00066
00067 struct sm_matrix_struct {
00068 sm_row **rows;
00069 int rows_size;
00070 sm_col **cols;
00071 int cols_size;
00072 sm_row *first_row;
00073 sm_row *last_row;
00074 int nrows;
00075 sm_col *first_col;
00076 sm_col *last_col;
00077 int ncols;
00078 char *user_word;
00079 };
00080
00081
00082 #define sm_get_col(A, colnum) \
00083 (((colnum) >= 0 && (colnum) < (A)->cols_size) ? \
00084 (A)->cols[colnum] : (sm_col *) 0)
00085
00086 #define sm_get_row(A, rownum) \
00087 (((rownum) >= 0 && (rownum) < (A)->rows_size) ? \
00088 (A)->rows[rownum] : (sm_row *) 0)
00089
00090 #define sm_foreach_row(A, prow) \
00091 for(prow = A->first_row; prow != 0; prow = prow->next_row)
00092
00093 #define sm_foreach_col(A, pcol) \
00094 for(pcol = A->first_col; pcol != 0; pcol = pcol->next_col)
00095
00096 #define sm_foreach_row_element(prow, p) \
00097 for(p = (prow == 0) ? 0 : prow->first_col; p != 0; p = p->next_col)
00098
00099 #define sm_foreach_col_element(pcol, p) \
00100 for(p = (pcol == 0) ? 0 : pcol->first_row; p != 0; p = p->next_row)
00101
00102 #define sm_put(x, val) \
00103 (x->user_word = (char *) val)
00104
00105 #define sm_get(type, x) \
00106 ((type) (x->user_word))
00107
00108 EXTERN sm_matrix *sm_allocate ARGS((void));
00109 EXTERN sm_matrix *sm_alloc_size ARGS((int, int));
00110 EXTERN void sm_free_space ARGS((sm_matrix *));
00111 EXTERN sm_matrix *sm_dup ARGS((sm_matrix *));
00112 EXTERN void sm_resize ARGS((sm_matrix *, int, int));
00113 EXTERN sm_element *sm_insert ARGS((sm_matrix *, int, int));
00114 EXTERN sm_element *sm_find ARGS((sm_matrix *, int, int));
00115 EXTERN void sm_remove ARGS((sm_matrix *, int, int));
00116 EXTERN void sm_remove_element ARGS((sm_matrix *, sm_element *));
00117 EXTERN void sm_delrow ARGS((sm_matrix *, int));
00118 EXTERN void sm_delcol ARGS((sm_matrix *, int));
00119 EXTERN void sm_copy_row ARGS((sm_matrix *, int, sm_row *));
00120 EXTERN void sm_copy_col ARGS((sm_matrix *, int, sm_col *));
00121 EXTERN sm_row *sm_longest_row ARGS((sm_matrix *));
00122 EXTERN sm_col *sm_longest_col ARGS((sm_matrix *));
00123 EXTERN int sm_num_elements ARGS((sm_matrix *));
00124 EXTERN int sm_read ARGS((FILE *, sm_matrix **));
00125 EXTERN int sm_read_compressed ARGS((FILE *, sm_matrix **));
00126 EXTERN void sm_write ARGS((FILE *, sm_matrix *));
00127 EXTERN void sm_print ARGS((FILE *, sm_matrix *));
00128 EXTERN void sm_dump ARGS((sm_matrix *, char *, int));
00129 EXTERN void sm_cleanup ARGS((void));
00130
00131 EXTERN sm_col *sm_col_alloc ARGS((void));
00132 EXTERN void sm_col_free ARGS((sm_col *));
00133 EXTERN sm_col *sm_col_dup ARGS((sm_col *));
00134 EXTERN sm_element *sm_col_insert ARGS((sm_col *, int));
00135 EXTERN void sm_col_remove ARGS((sm_col *, int));
00136 EXTERN sm_element *sm_col_find ARGS((sm_col *, int));
00137 EXTERN int sm_col_contains ARGS((sm_col *, sm_col *));
00138 EXTERN int sm_col_intersects ARGS((sm_col *, sm_col *));
00139 EXTERN int sm_col_compare ARGS((sm_col *, sm_col *));
00140 EXTERN sm_col *sm_col_and ARGS((sm_col *, sm_col *));
00141 EXTERN int sm_col_hash ARGS((sm_col *, int));
00142 EXTERN void sm_col_remove_element ARGS((sm_col *, sm_element *));
00143 EXTERN void sm_col_print ARGS((FILE *, sm_col *));
00144
00145 EXTERN sm_row *sm_row_alloc ARGS((void));
00146 EXTERN void sm_row_free ARGS((sm_row *));
00147 EXTERN sm_row *sm_row_dup ARGS((sm_row *));
00148 EXTERN sm_element *sm_row_insert ARGS((sm_row *, int));
00149 EXTERN void sm_row_remove ARGS((sm_row *, int));
00150 EXTERN sm_element *sm_row_find ARGS((sm_row *, int));
00151 EXTERN int sm_row_contains ARGS((sm_row *, sm_row *));
00152 EXTERN int sm_row_intersects ARGS((sm_row *, sm_row *));
00153 EXTERN int sm_row_compare ARGS((sm_row *, sm_row *));
00154 EXTERN sm_row *sm_row_and ARGS((sm_row *, sm_row *));
00155 EXTERN int sm_row_hash ARGS((sm_row *, int));
00156 EXTERN void sm_row_remove_element ARGS((sm_row *, sm_element *));
00157 EXTERN void sm_row_print ARGS((FILE *, sm_row *));
00158
00159 #endif