/*
   +----------------------------------------------------------------------+
   | Copyright © The PHP Group and Contributors.                          |
   +----------------------------------------------------------------------+
   | This source file is subject to the Modified BSD License that is      |
   | bundled with this package in the file LICENSE, and is available      |
   | through the World Wide Web at <https://www.php.net/license/>.        |
   |                                                                      |
   | SPDX-License-Identifier: BSD-3-Clause                                |
   +----------------------------------------------------------------------+
   | Authors: Nora Dossche  <ndossche@php.net>                            |
   +----------------------------------------------------------------------+
*/

#ifndef PHP_DOM_OBJ_MAP_H
#define PHP_DOM_OBJ_MAP_H

typedef struct dom_nnodemap_object dom_nnodemap_object;

typedef struct php_dom_obj_map_collection_iter {
	zend_long cur, next;
	xmlNodePtr candidate, basep;
} php_dom_obj_map_collection_iter;

typedef struct php_dom_obj_map_handler {
	zend_long (*length)(dom_nnodemap_object *);
	void (*get_item)(dom_nnodemap_object *, zend_long, zval *);
	xmlNodePtr (*get_ns_named_item)(dom_nnodemap_object *, const zend_string *, const char *);
	bool (*has_ns_named_item)(dom_nnodemap_object *, const zend_string *, const char *);
	void (*collection_named_item_iter)(dom_nnodemap_object *, php_dom_obj_map_collection_iter *);
	bool use_cache;
	bool nameless;
} php_dom_obj_map_handler;

typedef struct dom_nnodemap_object {
	dom_object *baseobj;
	zend_long cached_length;
	union {
		xmlHashTable *ht;
		HashTable *array;
		struct {
			xmlChar *local;
			zend_string *local_lower;
			xmlChar *ns;
		};
	};
	php_libxml_cache_tag cache_tag;
	dom_object *cached_obj;
	zend_long cached_obj_index;
	xmlDictPtr dict;
	const php_dom_obj_map_handler *handler;
	bool release_local;
	bool release_ns;
	bool release_array;
} dom_nnodemap_object;

void php_dom_create_obj_map(dom_object *basenode, dom_object *intern, xmlHashTablePtr ht, zend_string *local, zend_string *ns, const php_dom_obj_map_handler *handler);
void php_dom_obj_map_get_ns_named_item_into_zval(dom_nnodemap_object *objmap, const zend_string *named, const char *ns, zval *return_value);
void php_dom_obj_map_get_item_into_zval(dom_nnodemap_object *objmap, zend_long index, zval *return_value);
zend_long php_dom_get_nodelist_length(dom_object *obj);

extern const php_dom_obj_map_handler php_dom_obj_map_attributes;
extern const php_dom_obj_map_handler php_dom_obj_map_by_tag_name;
extern const php_dom_obj_map_handler php_dom_obj_map_by_class_name;
extern const php_dom_obj_map_handler php_dom_obj_map_child_elements;
extern const php_dom_obj_map_handler php_dom_obj_map_child_nodes;
extern const php_dom_obj_map_handler php_dom_obj_map_nodeset;
extern const php_dom_obj_map_handler php_dom_obj_map_entities;
extern const php_dom_obj_map_handler php_dom_obj_map_notations;
extern const php_dom_obj_map_handler php_dom_obj_map_noop;

#endif
