00001 #include "sparse.h"
00002 #include "util.h"
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #define sorted_insert(type, first, last, count, next, prev, value, newval, e) \
00021 if (last == 0) { \
00022 e->value = newval; \
00023 first = e; \
00024 last = e; \
00025 e->next = 0; \
00026 e->prev = 0; \
00027 count++; \
00028 } else if (last->value < newval) { \
00029 e->value = newval; \
00030 last->next = e; \
00031 e->prev = last; \
00032 last = e; \
00033 e->next = 0; \
00034 count++; \
00035 } else if (first->value > newval) { \
00036 e->value = newval; \
00037 first->prev = e; \
00038 e->next = first; \
00039 first = e; \
00040 e->prev = 0; \
00041 count++; \
00042 } else { \
00043 type *p; \
00044 for(p = first; p->value < newval; p = p->next) \
00045 ; \
00046 if (p->value > newval) { \
00047 e->value = newval; \
00048 p = p->prev; \
00049 p->next->prev = e; \
00050 e->next = p->next; \
00051 p->next = e; \
00052 e->prev = p; \
00053 count++; \
00054 } else { \
00055 e = p; \
00056 } \
00057 }
00058
00059
00060
00061
00062
00063 #define dll_unlink(p, first, last, next, prev, count) { \
00064 if (p->prev == 0) { \
00065 first = p->next; \
00066 } else { \
00067 p->prev->next = p->next; \
00068 } \
00069 if (p->next == 0) { \
00070 last = p->prev; \
00071 } else { \
00072 p->next->prev = p->prev; \
00073 } \
00074 count--; \
00075 }
00076
00077
00078 #ifdef FAST_AND_LOOSE
00079 extern sm_element *sm_element_freelist;
00080 extern sm_row *sm_row_freelist;
00081 extern sm_col *sm_col_freelist;
00082
00083 #define sm_element_alloc(newobj) \
00084 if (sm_element_freelist == NIL(sm_element)) { \
00085 newobj = ALLOC(sm_element, 1); \
00086 } else { \
00087 newobj = sm_element_freelist; \
00088 sm_element_freelist = sm_element_freelist->next_col; \
00089 } \
00090 newobj->user_word = NIL(char); \
00091
00092 #define sm_element_free(e) \
00093 (e->next_col = sm_element_freelist, sm_element_freelist = e)
00094
00095 #else
00096
00097 #define sm_element_alloc(newobj) \
00098 newobj = ALLOC(sm_element, 1); \
00099 newobj->user_word = NIL(char);
00100 #define sm_element_free(e) \
00101 FREE(e)
00102 #endif
00103
00104
00105 EXTERN void sm_row_remove_element(sm_row *, sm_element *);
00106 EXTERN void sm_col_remove_element(sm_col *, sm_element *);
00107
00108