UVES Pipeline Reference Manual  5.4.0
uves_deque.c
1 /*===========================================================================
2  Copyright (C) 2001 European Southern Observatory (ESO)
3 
4  This program is free software; you can redistribute it and/or
5  modify it under the terms of the GNU General Public License as
6  published by the Free Software Foundation; either version 2 of
7  the License, or (at your option) any later version.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public
15  License along with this program; if not, write to the Free
16  Software Foundation, Inc., 675 Massachusetss Ave, Cambridge,
17  MA 02139, USA.
18 
19  Corresponding concerning ESO-MIDAS should be addressed as follows:
20  Internet e-mail: midas@eso.org
21  Postal address: European Southern Observatory
22  Data Management Division
23  Karl-Schwarzschild-Strasse 2
24  D 85748 Garching bei Muenchen
25  GERMANY
26 ===========================================================================*/
27 #ifdef HAVE_CONFIG_H
28 # include <config.h>
29 #endif
30 
31 #include <uves_deque.h>
32 
33 #include <cpl.h>
34 #include <assert.h>
35 #include <stdlib.h>
36 #include <stdio.h>
37 #include <uves_msg.h>
39 {
40  void **members;
41  unsigned long front;
42  unsigned long size;
43  unsigned long back;
44 
45 };
46 
47 
48 uves_deque *
49 uves_deque_new(void)
50 {
51 
52  uves_deque *d = cpl_calloc(1, sizeof(*d));
53 
54 
55  if (d == NULL)
56  {
57  return NULL;
58  }
59 
60 
61  d->members = NULL;
62 
63 
64  d->front = 0;
65  d->size = 0;
66  d->back = 0;
67 
68 
69  return d;
70 }
71 
72 void
73 uves_deque_push_back(uves_deque *d, cxptr what)
74 {
75  assert( d != NULL );
76 
77  if (d->back == 0)
78  {
79 // fprintf(stderr, "old : %ld - %ld - %ld\n", d->front, d->size, d->back);
80  void **new_members;
81  unsigned long i;
82  d->back = d->size + 1;
83  new_members = cpl_calloc(d->front + d->size + d->back, sizeof(void *));
84 
85  for (i = 0; i < d->size; i++)
86  {
87  new_members[d->front + i] = d->members[d->front + i];
88  }
89 
90  cpl_free(d->members);
91  d->members = new_members;
92 
93 // fprintf(stderr, "new : %ld - %ld - %ld\n", d->front, d->size, d->back);
94  }
95 
96  d->members[d->front + d->size] = (cxptr)what;
97  d->size++;
98  d->back--;
99 
100  return;
101 }
102 
103 void
104 uves_deque_push_front(uves_deque *d, cxptr what)
105 {
106  assert( d != NULL );
107 
108  if (d->front == 0)
109  {
110 // fprintf(stderr, "old : %ld - %ld - %ld\n", d->front, d->size, d->back);
111  void **new_members;
112  unsigned long i;
113 
114  d->front = d->size + 1;
115  new_members = cpl_calloc(d->front + d->size + d->back, sizeof(void *));
116 
117  for (i = 0; i < d->size; i++)
118  {
119  new_members[d->front + i] = d->members[0 + i];
120  }
121 
122  cpl_free(d->members);
123  d->members = new_members;
124 
125 // fprintf(stderr, "new : %ld - %ld - %ld\n", d->front, d->size, d->back);
126  }
127 
128  d->front--;
129  d->size++;
130  d->members[d->front] = what;
131 
132  return;
133 }
134 
135 cxptr
136 uves_deque_get(const uves_deque *d, uves_deque_const_iterator indx)
137 {
138  assert( d != NULL );
139  assert( indx < d->size );
140 
141  return d->members[d->front + indx];
142 }
143 
144 uves_deque_iterator
145 uves_deque_erase(uves_deque *d, uves_deque_iterator indx, cx_free_func deallocate)
146 {
147  unsigned long i;
148 
149  //printf("indx = %d size = %d\n", indx, d->size);
150  assert( d != NULL );
151  assert( indx < d->size );
152 
153  deallocate(d->members[d->front + indx]);
154 
155  for (i = indx; i < d->size - 1; i++)
156  {
157  d->members[d->front + i] = d->members[d->front + i + 1];
158  }
159 
160  d->size--;
161  d->back++;
162 
163  return indx;
164 }
165 
166 void
167 uves_deque_insert(uves_deque *d, uves_deque_iterator indx, cxptr what)
168 {
169  //printf("indx = %d size = %d\n", indx, d->size);
170  assert( d != NULL );
171  assert( indx <= d->size );
172 
173  if ( indx == d->size )
174  {
175  uves_deque_push_back(d, what);
176  }
177  else
178  {
179  unsigned long i;
180 
181  assert( indx < d->size );
182  assert( d->size > 1 );
183 
184  uves_deque_push_back(d, d->members[d->front + d->size - 1]);
185 
186  for (i = d->size-1; i > indx; i--)
187  {
188  d->members[d->front + i] = d->members[d->front + i - 1];
189  }
190 
191  d->members[d->front + indx] = what;
192  }
193 
194  return;
195 }
196 
197 cxsize
198 uves_deque_size(const uves_deque *d)
199 {
200  assert( d != NULL );
201 
202  return d->size;
203 }
204 
205 
206 void
207 uves_deque_destroy(uves_deque *d, cx_free_func deallocate)
208 {
209  if (d != NULL)
210  {
211  if (deallocate != NULL)
212  {
213  unsigned long i;
214 
215  for (i = 0; i < d->size; i++)
216  {
217  deallocate(d->members[d->front + i]);
218  }
219  }
220  cpl_free(d->members);
221  cpl_free(d);
222  }
223 }
224 
225 cxbool
226 uves_deque_empty(const uves_deque *d)
227 {
228  assert(d != NULL);
229 
230  return (d->size == 0);
231 }
232 
233 uves_deque_iterator
234 uves_deque_begin(const uves_deque *d)
235 {
236  assert(d != NULL);
237  return 0;
238 }
239 
240 uves_deque_iterator
241 uves_deque_end(const uves_deque *d)
242 {
243  assert(d != NULL);
244  return d->size;
245 }
246 
247 uves_deque_iterator
248 uves_deque_next(const uves_deque *d, uves_deque_const_iterator i)
249 {
250  assert(d != NULL);
251 
252  return i+1;
253 }
254