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 TSRMLS_DC);
  34 
  35         /* check for end of iteration (FAILURE or SUCCESS if data is valid) */
  36         int (*valid)(zend_object_iterator *iter TSRMLS_DC);
  37 
  38         /* fetch the item data for the current element */
  39         void (*get_current_data)(zend_object_iterator *iter, zval ***data TSRMLS_DC);
  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 TSRMLS_DC);
  46 
  47         /* step forwards to next element */
  48         void (*move_forward)(zend_object_iterator *iter TSRMLS_DC);
  49 
  50         /* rewind to start of data (optional, may be NULL) */
  51         void (*rewind)(zend_object_iterator *iter TSRMLS_DC);
  52 
  53         /* invalidate current value/key (optional, may be NULL) */
  54         void (*invalidate_current)(zend_object_iterator *iter TSRMLS_DC);
  55 } zend_object_iterator_funcs;
  56 
  57 struct _zend_object_iterator {
  58         void *data;
  59         zend_object_iterator_funcs *funcs;
  60         ulong index; /* private to fe_reset/fe_fetch opcodes */
  61 };
  62 
  63 typedef struct _zend_class_iterator_funcs {
  64         zend_object_iterator_funcs  *funcs;
  65         union _zend_function *zf_new_iterator;
  66         union _zend_function *zf_valid;
  67         union _zend_function *zf_current;
  68         union _zend_function *zf_key;
  69         union _zend_function *zf_next;
  70         union _zend_function *zf_rewind;
  71 } zend_class_iterator_funcs;
  72 
  73 enum zend_object_iterator_kind {
  74         ZEND_ITER_INVALID,
  75         ZEND_ITER_PLAIN_ARRAY,
  76         ZEND_ITER_PLAIN_OBJECT,
  77         ZEND_ITER_OBJECT
  78 };
  79 
  80 BEGIN_EXTERN_C()
  81 /* given a zval, returns stuff that can be used to iterate it. */
  82 ZEND_API enum zend_object_iterator_kind zend_iterator_unwrap(zval *array_ptr, zend_object_iterator **iter TSRMLS_DC);
  83 
  84 /* given an iterator, wrap it up as a zval for use by the engine opcodes */
  85 ZEND_API zval *zend_iterator_wrap(zend_object_iterator *iter TSRMLS_DC);
  86 
  87 ZEND_API void zend_register_iterator_wrapper(TSRMLS_D);
  88 END_EXTERN_C()
  89 
  90 /*
  91  * Local variables:
  92  * tab-width: 4
  93  * c-basic-offset: 4
  94  * indent-tabs-mode: t
  95  * End:
  96  */

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