/*
|
*
|
* Copyright (c) 1994
|
* Hewlett-Packard Company
|
*
|
* Permission to use, copy, modify, distribute and sell this software
|
* and its documentation for any purpose is hereby granted without fee,
|
* provided that the above copyright notice appear in all copies and
|
* that both that copyright notice and this permission notice appear
|
* in supporting documentation. Hewlett-Packard Company makes no
|
* representations about the suitability of this software for any
|
* purpose. It is provided "as is" without express or implied warranty.
|
*
|
*
|
* Copyright (c) 1996
|
* Silicon Graphics Computer Systems, Inc.
|
*
|
* Permission to use, copy, modify, distribute and sell this software
|
* and its documentation for any purpose is hereby granted without fee,
|
* provided that the above copyright notice appear in all copies and
|
* that both that copyright notice and this permission notice appear
|
* in supporting documentation. Silicon Graphics makes no
|
* representations about the suitability of this software for any
|
* purpose. It is provided "as is" without express or implied warranty.
|
*/
|
|
/*
|
Copyright (c) 2007 Lao wen bo
|
|
This software is provided 'as-is', without any express or implied
|
warranty. In no event will the authors be held liable for any damages
|
arising from the use of this software.
|
|
Permission is granted to anyone to use this software for any purpose,
|
including commercial applications, and to alter it and redistribute it
|
freely, subject to the following restrictions:
|
|
1. The origin of this software must not be misrepresented; you must not
|
claim that you wrote the original software. If you use this software
|
in a product, an acknowledgment in the product documentation would be
|
appreciated but is not required.
|
|
2. Altered source versions must be plainly marked as such, and must not be
|
misrepresented as being the original software.
|
|
3. This notice may not be removed or altered from any source
|
distribution.
|
|
Lao wen bo
|
viewpl(at)gmail.com
|
*/
|
|
#ifndef _C_ITERATOR_H
|
#define _C_ITERATOR_H
|
|
#include "c_def.h"
|
|
#define c_iterator_ft _c_iterator_ft
|
#define c_iterator_pft _c_iterator_pft
|
#define c_reverse_iterator_ft _c_reverse_iterator_ft
|
#define c_reverse_iterator_pft _c_reverse_iterator_pft
|
#define c_iterator _c_iterator
|
#define c_reverse_iterator _c_reverse_iterator
|
#define c_distance _c_distance
|
#define c_distance1 _c_distance1
|
#define c_advance _c_advance
|
|
|
#define c_get_array_iterator _c_get_array_iterator
|
#define c_get_array_reverse_iterator _c_get_array_reverse_iterator
|
|
|
#define c_iterator_ref _c_iterator_ref
|
#define c_iterator_ref_assign _c_iterator_ref_assign
|
#define c_iterator_diff _c_iterator_diff
|
#define c_iterator_at _c_iterator_at
|
#define c_iterator_positive_n _c_iterator_positvie_n
|
#define c_iterator_negative_n _c_iterator_negative_n
|
#define c_iterator_equal _c_iterator_equal
|
#define c_iterator_less _c_iterator_less
|
|
|
typedef struct c_iterator c_iterator, * c_piterator;
|
typedef const c_iterator c_const_iterator;
|
|
typedef struct c_reverse_iterator c_reverse_iterator, * c_preverse_iterator;
|
typedef const c_reverse_iterator c_const_reverse_iterator;
|
|
typedef struct c_iterator_ft c_iterator_ft, * c_iterator_pft;
|
typedef struct c_reverse_iterator_ft c_reverse_iterator_ft, * c_reverse_iterator_pft;
|
|
typedef ptrdiff_t difference_type;
|
typedef void ** pointer;
|
typedef const void ** const_pointer;
|
typedef void * value_type;
|
typedef size_t size_type;
|
|
struct c_iterator
|
{
|
c_iterator_pft _pft;
|
void * _i;
|
};
|
|
struct c_reverse_iterator
|
{
|
c_reverse_iterator_pft _pft;
|
void * _i;
|
};
|
|
struct c_iterator_ft
|
{
|
c_iterator (* assign)(c_piterator thiz, const c_piterator val);
|
value_type (* ref)(c_piterator thiz);
|
value_type (* ref_assign)(c_piterator thiz, const value_type val);
|
c_iterator (* inc)(c_piterator thiz);
|
c_iterator (* inc_n)(c_piterator thiz, difference_type n);
|
c_iterator (* dec)(c_piterator thiz);
|
c_iterator (* dec_n)(c_piterator thiz, difference_type n);
|
difference_type (* diff)(c_piterator thiz, const c_piterator val);
|
value_type (* at)(c_piterator thiz, difference_type n);
|
c_iterator (* positive_n)(c_piterator thiz, difference_type n);
|
c_iterator (* negative_n)(c_piterator thiz, difference_type n);
|
c_bool (* equal)(c_piterator thiz, const c_piterator val);
|
c_bool (* less)(c_piterator thiz, const c_piterator val);
|
};
|
|
struct c_reverse_iterator_ft
|
{
|
c_reverse_iterator (* assign)(c_preverse_iterator thiz, const c_preverse_iterator val);
|
value_type (* ref)(c_preverse_iterator thiz);
|
value_type (* ref_assign)(c_preverse_iterator thiz, const value_type val);
|
c_reverse_iterator (* inc)(c_preverse_iterator thiz);
|
c_reverse_iterator (* inc_n)(c_preverse_iterator thiz, difference_type n);
|
c_reverse_iterator (* dec)(c_preverse_iterator thiz);
|
c_reverse_iterator (* dec_n)(c_preverse_iterator thiz, difference_type n);
|
difference_type (* diff)(c_preverse_iterator thiz, const c_preverse_iterator val);
|
value_type (* at)(c_preverse_iterator thiz, difference_type n);
|
c_reverse_iterator (* positive_n)(c_preverse_iterator thiz, difference_type n);
|
c_reverse_iterator (* negative_n)(c_preverse_iterator thiz, difference_type n);
|
c_bool (* equal)(c_preverse_iterator thiz, const c_preverse_iterator val);
|
c_bool (* less)(c_preverse_iterator thiz, const c_preverse_iterator val);
|
};
|
|
#define ITER_ASSIGN(X, Y) (X)._pft->assign(&(X), &(Y))
|
#define ITER_REF(X) (X)._pft->ref(&(X))
|
#define ITER_REF_ASSIGN(X, Y) (X)._pft->ref_assign(&(X), Y)
|
#define ITER_INC(X) (X)._pft->inc(&(X))
|
#define ITER_INC_N(X, Y) (X)._pft->inc_n(&(X), Y)
|
#define ITER_DEC(X) (X)._pft->dec(&(X))
|
#define ITER_DEC_N(X, Y) (X)._pft->dec_n(&(X), Y)
|
#define ITER_DIFF(X, Y) (X)._pft->diff(&(X), &(Y))
|
#define ITER_AT(X, Y) (X)._pft->at(&(X), Y)
|
#define ITER_POSITIVE_N(X, Y) (X)._pft->positive_n(&(X), Y)
|
#define ITER_NEGATIVE_N(X, Y) (X)._pft->negative_n(&(X), Y)
|
#define ITER_EQUAL(X, Y) (X)._pft->equal(&(X), &(Y))
|
#define ITER_LESS(X, Y) (X)._pft->less(&(X), &(Y))
|
|
|
#define CHECK_OUTPUT_ITERATOR(X) ((X)._pft->ref_assign)
|
#define CHECK_INPUT_ITERATOR(X) ((X)._pft->ref)
|
#define CHECK_FORWARD_ITERATOR(X) ((X)._pft->inc)
|
#define CHECK_BIDIRECTIONAL_ITERATOR(X) ((X)._pft->inc && (X)._pft->dec)
|
#define CHECK_RANDOM_ACCESS_ITERATOR(X) ((X)._pft->at && (X)._pft->diff)
|
|
typedef int (* COMPARER)(value_type , value_type);
|
|
difference_type c_distance(c_iterator first, c_iterator last);
|
void c_distance1(c_iterator first, c_iterator last, difference_type * pn);
|
void c_advance(c_piterator pval, difference_type n);
|
|
c_iterator c_get_array_iterator(void ** ppt);
|
c_reverse_iterator c_get_array_reverse_iterator(void ** ppt);
|
|
value_type c_iter_ref(c_iterator x);
|
value_type c_iter_ref_assign(c_iterator x, const value_type val);
|
difference_type c_iter_diff(c_iterator x, c_iterator y);
|
value_type c_iter_at(c_iterator x, difference_type n);
|
c_iterator c_iter_positive_n(c_iterator x, difference_type n);
|
c_iterator c_iter_negative_n(c_iterator x, difference_type n);
|
c_bool c_iter_equal(c_iterator x, c_iterator y);
|
c_bool c_iter_less(c_iterator x, c_iterator y);
|
|
|
#endif /* _C_ITERATOR_H */
|