uves_deque.c

00001 /*===========================================================================
00002   Copyright (C) 2001 European Southern Observatory (ESO)
00003  
00004   This program is free software; you can redistribute it and/or 
00005   modify it under the terms of the GNU General Public License as 
00006   published by the Free Software Foundation; either version 2 of 
00007   the License, or (at your option) any later version.
00008  
00009   This program is distributed in the hope that it will be useful,
00010   but WITHOUT ANY WARRANTY; without even the implied warranty of
00011   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012   GNU General Public License for more details.
00013  
00014   You should have received a copy of the GNU General Public 
00015   License along with this program; if not, write to the Free 
00016   Software Foundation, Inc., 675 Massachusetss Ave, Cambridge, 
00017   MA 02139, USA.
00018  
00019   Corresponding concerning ESO-MIDAS should be addressed as follows:
00020     Internet e-mail: midas@eso.org
00021     Postal address: European Southern Observatory
00022             Data Management Division 
00023             Karl-Schwarzschild-Strasse 2
00024             D 85748 Garching bei Muenchen 
00025             GERMANY
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 //      fprintf(stderr, "old : %ld - %ld - %ld\n", d->front, d->size, d->back);
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 //      fprintf(stderr, "new : %ld - %ld - %ld\n", d->front, d->size, d->back);
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 //      fprintf(stderr, "old : %ld - %ld - %ld\n", d->front, d->size, d->back);
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 //      fprintf(stderr, "new : %ld - %ld - %ld\n", d->front, d->size, d->back);
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     //printf("indx = %d size = %d\n", indx, d->size);
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     //printf("indx = %d size = %d\n", indx, d->size);
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 

Generated on 9 Mar 2012 for UVES Pipeline Reference Manual by  doxygen 1.6.1