root/Zend/zend_iterators.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /*
   2    +----------------------------------------------------------------------+
   3    | Zend Engine                                                          |
   4    +----------------------------------------------------------------------+
   5    | Copyright (c) 1998-2016 Zend Technologies Ltd. (http://www.zend.com) |
   6    +----------------------------------------------------------------------+
   7    | This source file is subject to version 2.00 of the Zend license,     |
   8    | that is bundled with this package in the file LICENSE, and is        |
   9    | available through the world-wide-web at the following url:           |
  10    | http://www.zend.com/license/2_00.txt.                                |
  11    | If you did not receive a copy of the Zend license and are unable to  |
  12    | obtain it through the world-wide-web, please send a note to          |
  13    | license@zend.com so we can mail you a copy immediately.              |
  14    +----------------------------------------------------------------------+
  15    | Author: Wez Furlong <wez@thebrainroom.com>                           |
  16    |         Marcus Boerger <helly@php.net>                               |
  17    +----------------------------------------------------------------------+
  18 */
  19 
  20 /* $Id$ */
  21 
  22 /* These iterators were designed to operate within the foreach()
  23  * structures provided by the engine, but could be extended for use
  24  * with other iterative engine opcodes.
  25  * These methods have similar semantics to the zend_hash API functions
  26  * with similar names.
  27  * */
  28 
  29 typedef struct _zend_object_iterator zend_object_iterator;
  30 
  31 typedef struct _zend_object_iterator_funcs {
  32         /* release all resources associated with this iterator instance */
  33         void (*dtor)(zend_object_iterator *iter);
  34 
  35         /* check for end of iteration (FAILURE or SUCCESS if data is valid) */
  36         int (*valid)(zend_object_iterator *iter);
  37 
  38         /* fetch the item data for the current element */
  39         zval *(*get_current_data)(zend_object_iterator *iter);
  40 
  41         /* fetch the key for the current element (optional, may be NULL). The key
  42          * should be written into the provided zval* using the ZVAL_* macros. If
  43          * this handler is not provided auto-incrementing integer keys will be
  44          * used. */
  45         void (*get_current_key)(zend_object_iterator *iter, zval *key);
  46 
  47         /* step forwards to next element */
  48         void (*move_forward)(zend_object_iterator *iter);
  49 
  50         /* rewind to start of data (optional, may be NULL) */
  51         void (*rewind)(zend_object_iterator *iter);
  52 
  53         /* invalidate current value/key (optional, may be NULL) */
  54         void (*invalidate_current)(zend_object_iterator *iter);
  55 } zend_object_iterator_funcs;
  56 
  57 struct _zend_object_iterator {
  58         zend_object std;
  59         zval data;
  60         zend_object_iterator_funcs *funcs;
  61         zend_ulong index; /* private to fe_reset/fe_fetch opcodes */
  62 };
  63 
  64 typedef struct _zend_class_iterator_funcs {
  65         zend_object_iterator_funcs  *funcs;
  66         union _zend_function *zf_new_iterator;
  67         union _zend_function *zf_valid;
  68         union _zend_function *zf_current;
  69         union _zend_function *zf_key;
  70         union _zend_function *zf_next;
  71         union _zend_function *zf_rewind;
  72 } zend_class_iterator_funcs;
  73 
  74 BEGIN_EXTERN_C()
  75 /* given a zval, returns stuff that can be used to iterate it. */
  76 ZEND_API zend_object_iterator* zend_iterator_unwrap(zval *array_ptr);
  77 
  78 /* given an iterator, wrap it up as a zval for use by the engine opcodes */
  79 ZEND_API void zend_iterator_init(zend_object_iterator *iter);
  80 ZEND_API void zend_iterator_dtor(zend_object_iterator *iter);
  81 
  82 ZEND_API void zend_register_iterator_wrapper(void);
  83 END_EXTERN_C()
  84 
  85 /*
  86  * Local variables:
  87  * tab-width: 4
  88  * c-basic-offset: 4
  89  * indent-tabs-mode: t
  90  * End:
  91  */

/* [<][>][^][v][top][bottom][index][help] */