Variant f_iterator_count(CVarRef obj) { Object pobj = get_traversable_object_iterator(obj); pobj->o_invoke_few_args(s_rewind, 0); int64_t count = 0; while (same(pobj->o_invoke_few_args(s_valid, 0), true)) { ++count; pobj->o_invoke_few_args(s_next, 0); } return count; }
Variant f_iterator_count(const Variant& obj) { CHECK_TRAVERSABLE_IMPL(obj, 0); Object pobj = get_traversable_object_iterator(obj); pobj->o_invoke_few_args(s_rewind, 0); int64_t count = 0; while (same(pobj->o_invoke_few_args(s_valid, 0), true)) { ++count; pobj->o_invoke_few_args(s_next, 0); } return count; }
Variant f_iterator_apply(CVarRef obj, CVarRef func, CArrRef params /* = null_array */) { Object pobj = get_traversable_object_iterator(obj); pobj->o_invoke_few_args(s_rewind, 0); int64_t count = 0; while (same(pobj->o_invoke_few_args(s_valid, 0), true)) { if (!same(vm_call_user_func(func, params), true)) { break; } ++count; pobj->o_invoke_few_args(s_next, 0); } return count; }
Variant f_iterator_apply(const Variant& obj, const Variant& func, const Array& params /* = null_array */) { CHECK_TRAVERSABLE_IMPL(obj, 0); Object pobj = get_traversable_object_iterator(obj); pobj->o_invoke_few_args(s_rewind, 0); int64_t count = 0; while (same(pobj->o_invoke_few_args(s_valid, 0), true)) { if (!same(vm_call_user_func(func, params), true)) { break; } ++count; pobj->o_invoke_few_args(s_next, 0); } return count; }
Variant f_iterator_to_array(CVarRef obj, bool use_keys /* = true */) { Object pobj = get_traversable_object_iterator(obj); Array ret(Array::Create()); pobj->o_invoke_few_args(s_rewind, 0); while (same(pobj->o_invoke_few_args(s_valid, 0), true)) { Variant val = pobj->o_invoke_few_args(s_current, 0); if (use_keys) { Variant key = pobj->o_invoke_few_args(s_key, 0); ret.set(key, val); } else { ret.append(val); } pobj->o_invoke_few_args(s_next, 0); } return ret; }
Array HHVM_FUNCTION(iterator_to_array, const Variant& obj, bool use_keys /* = true */) { VMRegAnchor _; Array ret(Array::Create()); CHECK_TRAVERSABLE_IMPL(obj, ret); Object pobj = get_traversable_object_iterator(obj); pobj->o_invoke_few_args(s_rewind, 0); while (same(pobj->o_invoke_few_args(s_valid, 0), true)) { Variant val = pobj->o_invoke_few_args(s_current, 0); if (use_keys) { Variant key = pobj->o_invoke_few_args(s_key, 0); ret.set(key, val); } else { ret.append(val); } pobj->o_invoke_few_args(s_next, 0); } return ret; }