30#define PTR_HEAP_BLOCK_SIZE 64
32#define SPL_HEAP_CORRUPTED 0x00000001
33#define SPL_HEAP_WRITE_LOCKED 0x00000002
80#define Z_SPLHEAP_P(zv) spl_heap_from_obj(Z_OBJ_P((zv)))
99static void spl_ptr_heap_zval_dtor(
void *elem) {
104static void spl_ptr_heap_zval_ctor(
void *elem) {
109static void spl_ptr_heap_pqueue_elem_dtor(
void *elem) {
116static void spl_ptr_heap_pqueue_elem_ctor(
void *elem) {
126 zend_call_method_with_2_params(
Z_OBJ_P(
object), heap_object->
std.
ce, &heap_object->
fptr_cmp,
"compare", &zresult,
a, b);
132 *
result = zval_get_long(&zresult);
164static int spl_ptr_heap_zval_max_cmp(
void *x,
void *y,
zval *
object) {
175 if (spl_ptr_heap_cmp_cb_helper(
object, heap_object,
a, b, &lval) ==
FAILURE) {
187static int spl_ptr_heap_zval_min_cmp(
void *x,
void *y,
zval *
object) {
198 if (spl_ptr_heap_cmp_cb_helper(
object, heap_object,
a, b, &lval) ==
FAILURE) {
210static int spl_ptr_pqueue_elem_cmp(
void *x,
void *y,
zval *
object) {
213 zval *a_priority_p = &
a->priority;
224 if (spl_ptr_heap_cmp_cb_helper(
object, heap_object, a_priority_p, b_priority_p, &lval) ==
FAILURE) {
239static int spl_ptr_pqueue_elem_cmp_long(
void *x,
void *y,
zval *
object) {
242 return a>b ? 1 : (
a<b ? -1 : 0);
246static int spl_ptr_pqueue_elem_cmp_double(
void *x,
void *y,
zval *
object) {
269static void spl_ptr_heap_insert(
spl_ptr_heap *heap,
void *elem,
void *cmp_userdata) {
283 for (i = heap->
count; i > 0 && heap->
cmp(spl_heap_elem(heap, (i-1)/2), elem, cmp_userdata) < 0; i = (i-1)/2) {
284 spl_heap_elem_copy(heap, spl_heap_elem(heap, i), spl_heap_elem(heap, (i-1)/2));
295 spl_heap_elem_copy(heap, spl_heap_elem(heap, i), elem);
300 if (heap->
count == 0) {
310 const int limit = (heap->
count-1)/2;
313 if (heap->
count == 0) {
320 spl_heap_elem_copy(heap, elem, spl_heap_elem(heap, 0));
322 heap->
dtor(spl_heap_elem(heap, 0));
325 bottom = spl_heap_elem(heap, --heap->
count);
327 for (i = 0; i < limit; i =
j) {
330 if (
j != heap->
count && heap->
cmp(spl_heap_elem(heap,
j+1), spl_heap_elem(heap,
j), cmp_userdata) > 0) {
335 if(heap->
cmp(bottom, spl_heap_elem(heap,
j), cmp_userdata) < 0) {
336 spl_heap_elem_copy(heap, spl_heap_elem(heap, i), spl_heap_elem(heap,
j));
349 void *to = spl_heap_elem(heap, i);
351 spl_heap_elem_copy(heap, to, bottom);
373 for (i = 0; i < heap->
count; ++i) {
374 heap->
ctor(spl_heap_elem(heap, i));
391 for (i = 0; i < heap->
count; ++i) {
392 heap->
dtor(spl_heap_elem(heap, i));
407static void spl_heap_object_free_storage(
zend_object *
object)
413 spl_ptr_heap_destroy(intern->
heap);
433 intern->
heap = spl_ptr_heap_clone(other->
heap);
446 intern->
heap = spl_ptr_heap_init(spl_ptr_pqueue_elem_cmp, spl_ptr_heap_pqueue_elem_ctor, spl_ptr_heap_pqueue_elem_dtor,
sizeof(
spl_pqueue_elem));
453 intern->
heap = spl_ptr_heap_init(
454 parent ==
spl_ce_SplMinHeap ? spl_ptr_heap_zval_min_cmp : spl_ptr_heap_zval_max_cmp,
455 spl_ptr_heap_zval_ctor, spl_ptr_heap_zval_dtor,
sizeof(
zval));
459 parent = parent->parent;
483 return spl_heap_object_new_ex(class_type,
NULL, 0);
489 zend_object *new_object = spl_heap_object_new_ex(old_object->
ce, old_object, 1);
503 zend_call_method_with_0_params(
object, intern->
std.
ce, &intern->
fptr_count,
"count", &
rv);
513 *
count = spl_ptr_heap_count(intern->
heap);
521 zval tmp, heap_array;
523 HashTable *properties = zend_std_get_properties_ex(&intern->
std);
526 debug_info =
zend_new_array(zend_hash_num_elements(properties) + 3);
542 add_index_zval(&heap_array, i, &elem);
544 zval *elem = spl_heap_elem(intern->
heap, i);
545 add_index_zval(&heap_array, i, elem);
571 *gc_data_count = 2 * intern->
heap->
count;
587 count = spl_ptr_heap_count(intern->
heap);
692 ((
type ==
IS_DOUBLE) ? spl_ptr_pqueue_elem_cmp_double : spl_ptr_pqueue_elem_cmp);
696 }
else if (new_cmp != intern->
heap->
cmp) {
697 intern->
heap->
cmp = spl_ptr_pqueue_elem_cmp;
729 spl_ptr_heap_pqueue_elem_dtor(&elem);
749 elem = spl_ptr_heap_top(intern->
heap);
923 if (
object->heap->count == 0) {
926 return spl_heap_elem(
object->heap, 0);
940 if (
object->heap->count == 0) {
946 spl_pqueue_extract_helper(&user_it->
value, elem,
object->flags);
948 return &user_it->
value;
1034 zval *element = spl_heap_elem(intern->
heap, 0);
1082 spl_heap_it_get_current_data,
1083 spl_heap_it_get_current_key,
1084 spl_heap_it_move_forward,
1093 spl_pqueue_it_get_current_data,
1094 spl_heap_it_get_current_key,
1095 spl_heap_it_move_forward,
1112 iterator->
it.
funcs = &spl_heap_it_funcs;
1116 return &iterator->
it;
1131 iterator->
it.
funcs = &spl_pqueue_it_funcs;
1135 return &iterator->
it;
1149 spl_handler_SplHeap.clone_obj = spl_heap_object_clone;
1150 spl_handler_SplHeap.count_elements = spl_heap_object_count_elements;
1151 spl_handler_SplHeap.get_gc = spl_heap_object_get_gc;
1152 spl_handler_SplHeap.free_obj = spl_heap_object_free_storage;
1170 spl_handler_SplPriorityQueue.clone_obj = spl_heap_object_clone;
1171 spl_handler_SplPriorityQueue.count_elements = spl_heap_object_count_elements;
1172 spl_handler_SplPriorityQueue.get_gc = spl_pqueue_object_get_gc;
1173 spl_handler_SplPriorityQueue.free_obj = spl_heap_object_free_storage;
count(Countable|array $value, int $mode=COUNT_NORMAL)
assert(mixed $assertion, Throwable|string|null $description=null)
extract(array &$array, int $flags=EXTR_OVERWRITE, string $prefix="")
memset(ptr, 0, type->size)
#define PHP_MINIT_FUNCTION
unsigned char key[REFLECTION_KEY_LEN]
PHPAPI zend_class_entry * spl_ce_RuntimeException
void spl_set_private_debug_info_property(const zend_class_entry *ce, const char *property, size_t property_len, HashTable *debug_info, zval *value)
PHPAPI zend_class_entry * spl_ce_SplHeap
int(* spl_ptr_heap_cmp_func)(void *, void *, zval *)
struct _spl_pqueue_elem spl_pqueue_elem
struct _spl_ptr_heap spl_ptr_heap
struct _spl_heap_object spl_heap_object
void(* spl_ptr_heap_dtor_func)(void *)
#define SPL_HEAP_CORRUPTED
#define PTR_HEAP_BLOCK_SIZE
PHPAPI zend_class_entry * spl_ce_SplMaxHeap
#define SPL_HEAP_WRITE_LOCKED
PHPAPI zend_class_entry * spl_ce_SplPriorityQueue
struct _spl_heap_it spl_heap_it
PHPAPI zend_class_entry * spl_ce_SplMinHeap
void(* spl_ptr_heap_ctor_func)(void *)
#define SPL_PQUEUE_EXTR_MASK
#define SPL_PQUEUE_EXTR_DATA
#define SPL_PQUEUE_EXTR_PRIORITY
#define SPL_PQUEUE_EXTR_BOTH
zend_function * fptr_count
spl_ptr_heap_cmp_func cmp
spl_ptr_heap_dtor_func dtor
spl_ptr_heap_ctor_func ctor
const zend_object_iterator_funcs * funcs
const zend_object_handlers * handlers
struct _zend_function::@236135173067030250234125302313220025134003177336 common
ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format,...)
ZEND_API zend_result zend_parse_parameters(uint32_t num_args, const char *type_spec,...)
ZEND_API void add_assoc_zval_ex(zval *arg, const char *key, size_t key_len, zval *value)
ZEND_API void object_properties_init(zend_object *object, zend_class_entry *class_type)
#define RETURN_COPY_DEREF(zv)
#define ZEND_PARSE_PARAMETERS_END()
#define zend_parse_parameters_none()
#define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args)
#define Z_PARAM_ZVAL(dest)
#define safe_erealloc(ptr, nmemb, size, offset)
#define ecalloc(nmemb, size)
#define safe_emalloc(nmemb, size, offset)
ZEND_API ZEND_COLD zend_object * zend_throw_exception(zend_class_entry *exception_ce, const char *message, zend_long code)
ZEND_API void(ZEND_FASTCALL *zend_touch_vm_stack_data)(void *vm_stack_data)
union _zend_function zend_function
ZEND_API void ZEND_FASTCALL zend_hash_copy(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor)
#define zend_new_array(size)
ZEND_API zend_class_entry * zend_ce_countable
ZEND_API void zend_user_it_invalidate_current(zend_object_iterator *_iter)
ZEND_API zend_class_entry * zend_ce_iterator
struct _zend_user_iterator zend_user_iterator
ZEND_API void zend_iterator_init(zend_object_iterator *iter)
struct _zend_object_iterator zend_object_iterator
struct _zend_object_iterator_funcs zend_object_iterator_funcs
ZEND_API HashTable * zend_std_get_properties(zend_object *zobj)
ZEND_API const zend_object_handlers std_object_handlers
ZEND_API void ZEND_FASTCALL zend_objects_clone_members(zend_object *new_object, zend_object *old_object)
ZEND_API void ZEND_FASTCALL zend_object_std_init(zend_object *object, zend_class_entry *ce)
ZEND_API void zend_object_std_dtor(zend_object *object)
ZEND_API int ZEND_FASTCALL zend_compare(zval *op1, zval *op2)
#define ZEND_NORMALIZE_BOOL(n)
#define ZEND_THREEWAY_COMPARE(a, b)
#define zend_always_inline
#define XtOffsetOf(s_type, field)
#define ZEND_UNREACHABLE()
#define UNEXPECTED(condition)
struct _zend_class_entry zend_class_entry
struct _zend_object zend_object
#define Z_TRY_ADDREF_P(pz)
struct _zend_array HashTable
void(* copy_ctor_func_t)(zval *pElement)
#define ZVAL_OBJ_COPY(z, o)
ZEND_RESULT_CODE zend_result
struct _zend_object_handlers zend_object_handlers
ZEND_API void zval_ptr_dtor(zval *zval_ptr)
ZEND_API void zval_add_ref(zval *p)