1 /*
2 *
3 * Copyright (c) 1994
4 * Hewlett-Packard Company
5 *
6 * Permission to use, copy, modify, distribute and sell this software
7 * and its documentation for any purpose is hereby granted without fee,
8 * provided that the above copyright notice appear in all copies and
9 * that both that copyright notice and this permission notice appear
10 * in supporting documentation. Hewlett-Packard Company makes no
11 * representations about the suitability of this software for any
12 * purpose. It is provided "as is" without express or implied warranty.
13 *
14 *
15 * Copyright (c) 1996
16 * Silicon Graphics Computer Systems, Inc.
17 *
18 * Permission to use, copy, modify, distribute and sell this software
19 * and its documentation for any purpose is hereby granted without fee,
20 * provided that the above copyright notice appear in all copies and
21 * that both that copyright notice and this permission notice appear
22 * in supporting documentation. Silicon Graphics makes no
23 * representations about the suitability of this software for any
24 * purpose. It is provided "as is" without express or implied warranty.
25 */
26
27 /*
28 Copyright (c) 2007 Lao wen bo
29
30 This software is provided 'as-is', without any express or implied
31 warranty. In no event will the authors be held liable for any damages
32 arising from the use of this software.
33
34 Permission is granted to anyone to use this software for any purpose,
35 including commercial applications, and to alter it and redistribute it
36 freely, subject to the following restrictions:
37
38 1. The origin of this software must not be misrepresented; you must not
39 claim that you wrote the original software. If you use this software
40 in a product, an acknowledgment in the product documentation would be
41 appreciated but is not required.
42
43 2. Altered source versions must be plainly marked as such, and must not be
44 misrepresented as being the original software.
45
46 3. This notice may not be removed or altered from any source
47 distribution.
48
49 Lao wen bo
50 viewpl(at)gmail.com
51 */
52
53 #include "c_iterator.h"
54
55 typedef void ** pp_t;
56
_c_array_iterator_assign(c_piterator thiz,const c_piterator val)57 static c_iterator _c_array_iterator_assign(c_piterator thiz, const c_piterator val)
58 {
59 if(thiz != val)
60 thiz->_i = val->_i;
61 return *thiz;
62 }
63
_c_array_iterator_ref(c_piterator thiz)64 static value_type _c_array_iterator_ref(c_piterator thiz)
65 {
66 return *(pp_t)thiz->_i;
67 }
68
_c_array_iterator_ref_assign(c_piterator thiz,const value_type val)69 static value_type _c_array_iterator_ref_assign(c_piterator thiz, const value_type val)
70 {
71 return *(pp_t)thiz->_i = val;
72 }
73
_c_array_iterator_inc(c_piterator thiz)74 static c_iterator _c_array_iterator_inc(c_piterator thiz)
75 {
76 pp_t p = thiz->_i;
77 ++ p;
78 thiz->_i = p;
79 return *thiz;
80 }
81
_c_array_iterator_inc_n(c_piterator thiz,difference_type n)82 static c_iterator _c_array_iterator_inc_n(c_piterator thiz, difference_type n)
83 {
84 pp_t p = thiz->_i;
85 p += n;
86 thiz->_i = p;
87 return *thiz;
88 }
89
_c_array_iterator_dec(c_piterator thiz)90 static c_iterator _c_array_iterator_dec(c_piterator thiz)
91 {
92 pp_t p = thiz->_i;
93 -- p;
94 thiz->_i = p;
95 return *thiz;
96 }
97
_c_array_iterator_dec_n(c_piterator thiz,difference_type n)98 static c_iterator _c_array_iterator_dec_n(c_piterator thiz, difference_type n)
99 {
100 pp_t p = thiz->_i;
101 p -= n;
102 thiz->_i = p;
103 return *thiz;
104 }
105
_c_array_iterator_diff(c_piterator thiz,const c_piterator val)106 static difference_type _c_array_iterator_diff(c_piterator thiz, const c_piterator val)
107 {
108 return ((pp_t)thiz->_i - (pp_t)val->_i);
109 }
110
_c_array_iterator_at(c_piterator thiz,difference_type n)111 static value_type _c_array_iterator_at(c_piterator thiz, difference_type n)
112 {
113 return *((pp_t)thiz->_i + n);
114 }
115
_c_array_iterator_positive_n(c_piterator thiz,difference_type n)116 static c_iterator _c_array_iterator_positive_n(c_piterator thiz, difference_type n)
117 {
118 c_iterator iter;
119 pp_t p = thiz->_i;
120 p += n;
121 iter = c_get_array_iterator(p);
122 return iter;
123 }
124
_c_array_iterator_negative_n(c_piterator thiz,difference_type n)125 static c_iterator _c_array_iterator_negative_n(c_piterator thiz, difference_type n)
126 {
127 c_iterator iter;
128 pp_t p = thiz->_i;
129 p -= n;
130 iter = c_get_array_iterator(p);
131 return iter;
132 }
133
_c_array_iterator_equal(c_piterator thiz,const c_piterator val)134 static c_bool _c_array_iterator_equal(c_piterator thiz, const c_piterator val)
135 {
136 return (thiz->_i == val->_i &&
137 thiz->_pft == val->_pft);
138 }
139
_c_array_iterator_less(c_piterator thiz,const c_piterator val)140 static c_bool _c_array_iterator_less(c_piterator thiz, const c_piterator val)
141 {
142 return ((pp_t)thiz->_i < (pp_t)val->_i);
143 }
144
145 static c_iterator_ft _c_array_iterator_ft =
146 {
147 _c_array_iterator_assign,
148 _c_array_iterator_ref,
149 _c_array_iterator_ref_assign,
150 _c_array_iterator_inc,
151 _c_array_iterator_inc_n,
152 _c_array_iterator_dec,
153 _c_array_iterator_dec_n,
154 _c_array_iterator_diff,
155 _c_array_iterator_at,
156 _c_array_iterator_positive_n,
157 _c_array_iterator_negative_n,
158 _c_array_iterator_equal,
159 _c_array_iterator_less
160 };
161
c_get_array_iterator(void ** ppt)162 c_iterator c_get_array_iterator(void ** ppt)
163 {
164 c_iterator iter;
165 iter._pft = &_c_array_iterator_ft;
166 iter._i = ppt;
167 return iter;
168 }
169
_c_array_reverse_iterator_assign(c_preverse_iterator thiz,const c_preverse_iterator val)170 static c_reverse_iterator _c_array_reverse_iterator_assign(c_preverse_iterator thiz, const c_preverse_iterator val)
171 {
172 if(thiz != val)
173 thiz->_i = val->_i;
174 return *thiz;
175 }
176
_c_array_reverse_iterator_ref(c_preverse_iterator thiz)177 static value_type _c_array_reverse_iterator_ref(c_preverse_iterator thiz)
178 {
179 return *(pp_t)thiz->_i;
180 }
181
_c_array_reverse_iterator_ref_assign(c_preverse_iterator thiz,const value_type val)182 static value_type _c_array_reverse_iterator_ref_assign(c_preverse_iterator thiz, const value_type val)
183 {
184 return *(pp_t)thiz->_i = val;
185 }
186
_c_array_reverse_iterator_inc(c_preverse_iterator thiz)187 static c_reverse_iterator _c_array_reverse_iterator_inc(c_preverse_iterator thiz)
188 {
189 pp_t p = thiz->_i;
190 -- p;
191 thiz->_i = p;
192 return *thiz;
193 }
194
_c_array_reverse_iterator_inc_n(c_preverse_iterator thiz,difference_type n)195 static c_reverse_iterator _c_array_reverse_iterator_inc_n(c_preverse_iterator thiz, difference_type n)
196 {
197 pp_t p = thiz->_i;
198 p -= n;
199 thiz->_i = p;
200 return *thiz;
201 }
202
_c_array_reverse_iterator_dec(c_preverse_iterator thiz)203 static c_reverse_iterator _c_array_reverse_iterator_dec(c_preverse_iterator thiz)
204 {
205 pp_t p = thiz->_i;
206 ++ p;
207 thiz->_i = p;
208 return *thiz;
209 }
210
_c_array_reverse_iterator_dec_n(c_preverse_iterator thiz,difference_type n)211 static c_reverse_iterator _c_array_reverse_iterator_dec_n(c_preverse_iterator thiz, difference_type n)
212 {
213 pp_t p = thiz->_i;
214 p += n;
215 thiz->_i = p;
216 return *thiz;
217 }
218
_c_array_reverse_iterator_diff(c_preverse_iterator thiz,const c_preverse_iterator val)219 static difference_type _c_array_reverse_iterator_diff(c_preverse_iterator thiz, const c_preverse_iterator val)
220 {
221 return ((pp_t)val->_i - (pp_t)thiz->_i);
222 }
223
_c_array_reverse_iterator_at(c_preverse_iterator thiz,difference_type n)224 static value_type _c_array_reverse_iterator_at(c_preverse_iterator thiz, difference_type n)
225 {
226 return *((pp_t)thiz->_i - n);
227 }
228
_c_array_reverse_iterator_positive_n(c_preverse_iterator thiz,difference_type n)229 static c_reverse_iterator _c_array_reverse_iterator_positive_n(c_preverse_iterator thiz, difference_type n)
230 {
231 c_reverse_iterator iter;
232 pp_t p = thiz->_i;
233 p -= n;
234 iter = c_get_array_reverse_iterator(p);
235 return iter;
236 }
237
_c_array_reverse_iterator_negative_n(c_preverse_iterator thiz,difference_type n)238 static c_reverse_iterator _c_array_reverse_iterator_negative_n(c_preverse_iterator thiz, difference_type n)
239 {
240 c_reverse_iterator iter;
241 pp_t p = thiz->_i;
242 p += n;
243 iter = c_get_array_reverse_iterator(p);
244 return iter;
245 }
246
_c_array_reverse_iterator_equal(c_preverse_iterator thiz,const c_preverse_iterator val)247 static c_bool _c_array_reverse_iterator_equal(c_preverse_iterator thiz, const c_preverse_iterator val)
248 {
249 return (thiz->_i == val->_i &&
250 thiz->_pft == val->_pft);
251 }
252
_c_array_reverse_iterator_less(c_preverse_iterator thiz,const c_preverse_iterator val)253 static c_bool _c_array_reverse_iterator_less(c_preverse_iterator thiz, const c_preverse_iterator val)
254 {
255 return ((pp_t)thiz->_i > (pp_t)val->_i);
256 }
257
258 static c_reverse_iterator_ft _c_array_reverse_iterator_ft =
259 {
260 _c_array_reverse_iterator_assign,
261 _c_array_reverse_iterator_ref,
262 _c_array_reverse_iterator_ref_assign,
263 _c_array_reverse_iterator_inc,
264 _c_array_reverse_iterator_inc_n,
265 _c_array_reverse_iterator_dec,
266 _c_array_reverse_iterator_dec_n,
267 _c_array_reverse_iterator_diff,
268 _c_array_reverse_iterator_at,
269 _c_array_reverse_iterator_positive_n,
270 _c_array_reverse_iterator_negative_n,
271 _c_array_reverse_iterator_equal,
272 _c_array_reverse_iterator_less
273 };
274
c_get_array_reverse_iterator(void ** ppt)275 c_reverse_iterator c_get_array_reverse_iterator(void ** ppt)
276 {
277 c_reverse_iterator iter;
278 iter._pft = &_c_array_reverse_iterator_ft;
279 iter._i = ppt;
280 return iter;
281 }
282
c_distance(c_iterator first,c_iterator last)283 difference_type c_distance(c_iterator first, c_iterator last)
284 {
285 if(CHECK_RANDOM_ACCESS_ITERATOR(first) &&
286 CHECK_RANDOM_ACCESS_ITERATOR(last))
287 return ITER_DIFF(last, first);
288 else
289 {
290 difference_type n = 0;
291 while(!ITER_EQUAL(first, last))
292 {
293 ITER_INC(first);
294 ++ n;
295 }
296 return n;
297 }
298 }
299
c_distance1(c_iterator first,c_iterator last,difference_type * pn)300 void c_distance1(c_iterator first, c_iterator last, difference_type * pn)
301 {
302 if(CHECK_RANDOM_ACCESS_ITERATOR(first) &&
303 CHECK_RANDOM_ACCESS_ITERATOR(last))
304 *pn += ITER_DIFF(last, first);
305 else
306 {
307 while(!ITER_EQUAL(first, last))
308 {
309 ITER_INC(first);
310 ++ *pn;
311 }
312 }
313 }
314
c_advance(c_piterator pval,difference_type n)315 void c_advance(c_piterator pval, difference_type n)
316 {
317 c_iterator val = *pval;
318 if(CHECK_RANDOM_ACCESS_ITERATOR(val))
319 ITER_INC_N(val, n);
320 else if(CHECK_BIDIRECTIONAL_ITERATOR(val))
321 {
322 if(n >= 0)
323 while(n --)
324 ITER_INC(val);
325 else
326 while(n ++)
327 ITER_DEC(val);
328 }
329 else
330 while(n --)
331 ITER_INC(val);
332 *pval = val;
333 }
334
c_iter_ref(c_iterator x)335 value_type c_iter_ref(c_iterator x)
336 {
337 return ITER_REF(x);
338 }
339
c_iter_ref_assign(c_iterator x,const value_type val)340 value_type c_iter_ref_assign(c_iterator x, const value_type val)
341 {
342 return ITER_REF_ASSIGN(x, val);
343 }
344
c_iter_diff(c_iterator x,c_iterator y)345 difference_type c_iter_diff(c_iterator x, c_iterator y)
346 {
347 return ITER_DIFF(x, y);
348 }
349
c_iter_at(c_iterator x,difference_type n)350 value_type c_iter_at(c_iterator x, difference_type n)
351 {
352 return ITER_AT(x, n);
353 }
354
c_iter_positive_n(c_iterator x,difference_type n)355 c_iterator c_iter_positive_n(c_iterator x, difference_type n)
356 {
357 return ITER_POSITIVE_N(x, n);
358 }
359
c_iter_negative_n(c_iterator x,difference_type n)360 c_iterator c_iter_negative_n(c_iterator x, difference_type n)
361 {
362 return ITER_NEGATIVE_N(x, n);
363 }
364
c_iter_equal(c_iterator x,c_iterator y)365 c_bool c_iter_equal(c_iterator x, c_iterator y)
366 {
367 return ITER_EQUAL(x, y);
368 }
369
c_iter_less(c_iterator x,c_iterator y)370 c_bool c_iter_less(c_iterator x, c_iterator y)
371 {
372 return ITER_LESS(x, y);
373 }
374
375
376