uves_deque.c
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 #ifdef HAVE_CONFIG_H
00028 # include <config.h>
00029 #endif
00030
00031 #include <uves_deque.h>
00032
00033 #include <cpl.h>
00034 #include <assert.h>
00035 #include <stdlib.h>
00036 #include <stdio.h>
00037 #include <uves_msg.h>
00038 struct _uves_deque_
00039 {
00040 void **members;
00041 unsigned long front;
00042 unsigned long size;
00043 unsigned long back;
00044
00045 };
00046
00047
00048 uves_deque *
00049 uves_deque_new(void)
00050 {
00051
00052 uves_deque *d = cpl_calloc(1, sizeof(*d));
00053
00054
00055 if (d == NULL)
00056 {
00057 return NULL;
00058 }
00059
00060
00061 d->members = NULL;
00062
00063
00064 d->front = 0;
00065 d->size = 0;
00066 d->back = 0;
00067
00068
00069 return d;
00070 }
00071
00072 void
00073 uves_deque_push_back(uves_deque *d, cxptr what)
00074 {
00075 assert( d != NULL );
00076
00077 if (d->back == 0)
00078 {
00079
00080 void **new_members;
00081 unsigned long i;
00082 d->back = d->size + 1;
00083 new_members = cpl_calloc(d->front + d->size + d->back, sizeof(void *));
00084
00085 for (i = 0; i < d->size; i++)
00086 {
00087 new_members[d->front + i] = d->members[d->front + i];
00088 }
00089
00090 cpl_free(d->members);
00091 d->members = new_members;
00092
00093
00094 }
00095
00096 d->members[d->front + d->size] = (cxptr)what;
00097 d->size++;
00098 d->back--;
00099
00100 return;
00101 }
00102
00103 void
00104 uves_deque_push_front(uves_deque *d, cxptr what)
00105 {
00106 assert( d != NULL );
00107
00108 if (d->front == 0)
00109 {
00110
00111 void **new_members;
00112 unsigned long i;
00113
00114 d->front = d->size + 1;
00115 new_members = cpl_calloc(d->front + d->size + d->back, sizeof(void *));
00116
00117 for (i = 0; i < d->size; i++)
00118 {
00119 new_members[d->front + i] = d->members[0 + i];
00120 }
00121
00122 cpl_free(d->members);
00123 d->members = new_members;
00124
00125
00126 }
00127
00128 d->front--;
00129 d->size++;
00130 d->members[d->front] = what;
00131
00132 return;
00133 }
00134
00135 cxptr
00136 uves_deque_get(const uves_deque *d, uves_deque_const_iterator indx)
00137 {
00138 assert( d != NULL );
00139 assert( indx < d->size );
00140
00141 return d->members[d->front + indx];
00142 }
00143
00144 uves_deque_iterator
00145 uves_deque_erase(uves_deque *d, uves_deque_iterator indx, cx_free_func deallocate)
00146 {
00147 unsigned long i;
00148
00149
00150 assert( d != NULL );
00151 assert( indx < d->size );
00152
00153 deallocate(d->members[d->front + indx]);
00154
00155 for (i = indx; i < d->size - 1; i++)
00156 {
00157 d->members[d->front + i] = d->members[d->front + i + 1];
00158 }
00159
00160 d->size--;
00161 d->back++;
00162
00163 return indx;
00164 }
00165
00166 void
00167 uves_deque_insert(uves_deque *d, uves_deque_iterator indx, cxptr what)
00168 {
00169
00170 assert( d != NULL );
00171 assert( indx <= d->size );
00172
00173 if ( indx == d->size )
00174 {
00175 uves_deque_push_back(d, what);
00176 }
00177 else
00178 {
00179 unsigned long i;
00180
00181 assert( indx < d->size );
00182 assert( d->size > 1 );
00183
00184 uves_deque_push_back(d, d->members[d->front + d->size - 1]);
00185
00186 for (i = d->size-1; i > indx; i--)
00187 {
00188 d->members[d->front + i] = d->members[d->front + i - 1];
00189 }
00190
00191 d->members[d->front + indx] = what;
00192 }
00193
00194 return;
00195 }
00196
00197 cxsize
00198 uves_deque_size(const uves_deque *d)
00199 {
00200 assert( d != NULL );
00201
00202 return d->size;
00203 }
00204
00205
00206 void
00207 uves_deque_destroy(uves_deque *d, cx_free_func deallocate)
00208 {
00209 if (d != NULL)
00210 {
00211 if (deallocate != NULL)
00212 {
00213 unsigned long i;
00214
00215 for (i = 0; i < d->size; i++)
00216 {
00217 deallocate(d->members[d->front + i]);
00218 }
00219 }
00220 cpl_free(d->members);
00221 cpl_free(d);
00222 }
00223 }
00224
00225 cxbool
00226 uves_deque_empty(const uves_deque *d)
00227 {
00228 assert(d != NULL);
00229
00230 return (d->size == 0);
00231 }
00232
00233 uves_deque_iterator
00234 uves_deque_begin(const uves_deque *d)
00235 {
00236 assert(d != NULL);
00237 return 0;
00238 }
00239
00240 uves_deque_iterator
00241 uves_deque_end(const uves_deque *d)
00242 {
00243 assert(d != NULL);
00244 return d->size;
00245 }
00246
00247 uves_deque_iterator
00248 uves_deque_next(const uves_deque *d, uves_deque_const_iterator i)
00249 {
00250 assert(d != NULL);
00251
00252 return i+1;
00253 }
00254