00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef __EG_AEQUISET_H__
00038 #define __EG_AEQUISET_H__
00039 #include <stdio.h>
00040 #include <stdlib.h>
00041 #include <string.h>
00042 #include "eg_config.h"
00043 #include "eg_macros.h"
00044 #include "eg_mempool.h"
00045 #ifndef EG_AEQUISET_DLEVEL
00046 #define EG_AEQUISET_DLEVEL 10
00047 #endif
00048
00049
00050
00051 typedef struct EGaequiSetElem_t
00052 {
00053 unsigned father;
00054 unsigned rank;
00055 void *this;
00056 }
00057 EGaequiSetElem_t;
00058
00059
00060
00061
00062 typedef struct EGaequiSet_t
00063 {
00064 unsigned size;
00065 EGaequiSetElem_t *set;
00066 EGmemPool_t *mem;
00067 }
00068 EGaequiSet_t;
00069
00070
00071
00072 extern inline EGaequiSet_t *EGaequiSetCopyMP (EGaequiSet_t * U,
00073 EGcopyMP_f data_copy,
00074 EGmemPool_t * mem)
00075 {
00076
00077 EGaequiSet_t *orig = (EGaequiSet_t *) U,
00078 *copy;
00079 register unsigned i;
00080
00081
00082 copy = EGmemPoolSMalloc (orig->mem, EGaequiSet_t, 1);
00083 copy->mem = orig->mem;
00084 copy->size = orig->size;
00085 copy->set = EGmemPoolSMalloc (mem, EGaequiSetElem_t, orig->size);
00086 memcpy (copy->set, orig->set, sizeof (EGaequiSetElem_t) * orig->size);
00087
00088
00089 if (data_copy)
00090 for (i = copy->size; i--;)
00091 copy->set[i].this = data_copy (orig->set[i].this, mem);
00092
00093
00094 return copy;
00095 }
00096
00097
00098
00099 extern inline EGaequiSet_t *EGaequiSetCopy (EGaequiSet_t * U,
00100 EGcopy_f data_copy)
00101 {
00102
00103 EGaequiSet_t *orig = (EGaequiSet_t *) U,
00104 *copy;
00105 register unsigned i;
00106
00107
00108 copy = EGmemPoolSMalloc (orig->mem, EGaequiSet_t, 1);
00109 copy->mem = orig->mem;
00110 copy->size = orig->size;
00111 copy->set = EGmemPoolSMalloc (orig->mem, EGaequiSetElem_t, orig->size);
00112 memcpy (copy->set, orig->set, sizeof (EGaequiSetElem_t) * orig->size);
00113
00114
00115 if (data_copy)
00116 for (i = copy->size; i--;)
00117 copy->set[i].this = data_copy (orig->set[i].this);
00118
00119
00120 return copy;
00121 }
00122
00123
00124
00125
00126 extern inline EGaequiSet_t *EGnewAEquiSet (EGmemPool_t * mem,
00127 const unsigned size)
00128 {
00129
00130 EGaequiSet_t *v;
00131 register unsigned i;
00132 EGaequiSetElem_t *elem;
00133
00134
00135 v = EGmemPoolSMalloc (mem, EGaequiSet_t, 1);
00136 v->mem = mem;
00137 v->size = size;
00138 v->set = EGmemPoolSMalloc (mem, EGaequiSetElem_t, size);
00139 for (elem = v->set + size, i = size; i--;)
00140 {
00141 elem--;
00142 elem->father = i;
00143 elem->this = 0;
00144 elem->rank = 0;
00145 }
00146
00147
00148 return v;
00149 }
00150
00151
00152
00153 unsigned EGaequiSetFind (EGaequiSet_t * const s,
00154 const unsigned elem);
00155
00156
00157
00158 extern inline unsigned EGaequiSetLink (EGaequiSet_t * const U,
00159 const unsigned u,
00160 const unsigned v)
00161 {
00162
00163 EGaequiSetElem_t *w,
00164 *uptr,
00165 *vptr;
00166
00167
00168 EXITL (EG_AEQUISET_DLEVEL, u >= U->size,
00169 "elem (%u) is out of range (size = %u)", u, U->size);
00170 EXITL (EG_AEQUISET_DLEVEL, v >= U->size,
00171 "elem (%u) is out of range (size = %u)", v, U->size);
00172 EXITL (EG_AEQUISET_DLEVEL, v != U->set[v].father,
00173 "v is not a representant for its class");
00174 EXITL (EG_AEQUISET_DLEVEL, u != U->set[u].father,
00175 "u is not a representant for its class");
00176
00177
00178 uptr = U->set + u;
00179 vptr = U->set + v;
00180 if (uptr->rank < vptr->rank)
00181 {
00182 w = uptr;
00183 uptr = vptr;
00184 vptr = w;
00185 }
00186
00187 if (uptr->rank == vptr->rank)
00188 {
00189 uptr->rank++;
00190 }
00191
00192
00193 vptr->father = uptr - U->set;
00194
00195
00196 return vptr->father;
00197 }
00198
00199
00200
00201 extern inline void EGaequiSetReset (EGaequiSet_t * const U)
00202 {
00203 unsigned register i;
00204 EGaequiSetElem_t *elem;
00205 for (i = U->size, elem = U->set + U->size; i--;)
00206 {
00207 elem--;
00208 elem->father = i;
00209 elem->this = 0;
00210 elem->rank = 0;
00211 }
00212 return;
00213 }
00214
00215
00216
00217
00218 extern inline void EGfreeAEquiSet (void *U)
00219 {
00220 EGmemPoolSFree (((EGaequiSet_t *) U)->set,
00221 EGaequiSetElem_t,
00222 ((EGaequiSet_t *) U)->size, ((EGaequiSet_t *) U)->mem);
00223 EGmemPoolSFree (((EGaequiSet_t *) U),
00224 EGaequiSet_t, 1, ((EGaequiSet_t *) U)->mem);
00225 return;
00226 }
00227
00228
00229
00230
00231 #endif