xref: /OK3568_Linux_fs/external/security/rk_tee_user/v2/ta/vector_util/c_iterator.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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