From ee2d13b031072e51e0b8b2f89508df32898d1ae4 Mon Sep 17 00:00:00 2001 From: andrewparoski Date: Wed, 13 Mar 2013 22:30:24 -0700 Subject: [PATCH] Add add() API for collections --- hphp/idl/collections.idl.php | 38 ++++++ hphp/runtime/ext/ext_collections.cpp | 114 ++++++++++++++++-- hphp/runtime/ext/ext_collections.ext_hhvm.cpp | 78 ++++++++++++ hphp/runtime/ext/ext_collections.h | 28 ++++- hphp/runtime/ext_hhvm/ext_hhvm_infotabs.cpp | 8 +- hphp/system/class_map.cpp | 14 ++- hphp/system/collections.inc | 6 +- hphp/test/test_code_run.cpp | 36 ++++++ 8 files changed, 302 insertions(+), 20 deletions(-) diff --git a/hphp/idl/collections.idl.php b/hphp/idl/collections.idl.php index 46034b281..987119ab9 100644 --- a/hphp/idl/collections.idl.php +++ b/hphp/idl/collections.idl.php @@ -321,6 +321,8 @@ DefineFunction( array( 'name' => "add", 'flags' => HasDocComment, + 'desc' => "Adds the specified value to the end of this Vector using ". + "the next available integer key.", 'return' => array( 'type' => Object, ), @@ -925,6 +927,24 @@ DefineFunction( ), )); +DefineFunction( + array( + 'name' => "add", + 'flags' => HasDocComment, + 'desc' => "Adds the specified key/value Tuple to this Map. If an ". + "element with the same key is already present, an exception ". + "is thrown.", + 'return' => array( + 'type' => Object, + ), + 'args' => array( + array( + 'name' => "val", + 'type' => Variant, + ), + ), + )); + DefineFunction( array( 'name' => "toArray", @@ -1474,6 +1494,24 @@ DefineFunction( ), )); +DefineFunction( + array( + 'name' => "add", + 'flags' => HasDocComment, + 'desc' => "Adds the specified key/value Tuple to this StableMap. If an ". + "element with the same key is already present, an exception ". + "is thrown.", + 'return' => array( + 'type' => Object, + ), + 'args' => array( + array( + 'name' => "val", + 'type' => Variant, + ), + ), + )); + DefineFunction( array( 'name' => "toArray", diff --git a/hphp/runtime/ext/ext_collections.cpp b/hphp/runtime/ext/ext_collections.cpp index 49f73eb99..177892703 100644 --- a/hphp/runtime/ext/ext_collections.cpp +++ b/hphp/runtime/ext/ext_collections.cpp @@ -956,6 +956,15 @@ ObjectData* c_Map::clone() { return obj; } +Object c_Map::t_add(CVarRef val) { + TypedValue* tv = (TypedValue*)(&val); + if (UNLIKELY(tv->m_type == KindOfRef)) { + tv = tv->m_data.pref->tv(); + } + add(tv); + return this; +} + Object c_Map::t_clear() { deleteBuckets(); freeData(); @@ -1337,6 +1346,32 @@ void c_Map::throwOOB(StringData* key) { throwStrOOB(key); } +void c_Map::add(TypedValue* val) { + if (UNLIKELY(val->m_type != KindOfObject || + !val->m_data.pobj->instanceof(c_Tuple::s_cls))) { + Object e(SystemLib::AllocInvalidArgumentExceptionObject( + "Parameter must be an instance of Tuple")); + throw e; + } + auto tup = static_cast(val->m_data.pobj); + if (UNLIKELY(tup->t_count() != 2)) { + Object e(SystemLib::AllocInvalidArgumentExceptionObject( + "Expected Tuple containing exactly two elements")); + throw e; + } + TypedValue* tvKey = &tup->getData()[0]; + TypedValue* tvValue = &tup->getData()[1]; + assert(tvKey->m_type != KindOfRef); + assert(tvValue->m_type != KindOfRef); + if (tvKey->m_type == KindOfInt64) { + updateImpl(tvKey->m_data.num, tvValue); + } else if (IS_STRING_TYPE(tvKey->m_type)) { + updateImpl(tvKey->m_data.pstr, tvValue); + } else { + throwBadKeyType(); + } +} + #define STRING_HASH(x) (int32_t(x) | 0x80000000) bool inline hitStringKey(const c_Map::Bucket* p, const char* k, @@ -1448,11 +1483,17 @@ c_Map::Bucket* c_Map::findForNewInsert(size_t h0) const { #undef FIND_BODY #undef FIND_FOR_INSERT_BODY -bool c_Map::update(int64_t h, TypedValue* data) { +template +bool c_Map::updateImpl(int64_t h, TypedValue* data) { assert(data->m_type != KindOfRef); Bucket* p = findForInsert(h); assert(p); if (p->validValue()) { + if (throwIfExists) { + Object e(SystemLib::AllocInvalidArgumentExceptionObject( + "An element with the same key already exists")); + throw e; + } tvRefcountedIncRef(data); tvRefcountedDecRef(&p->data); p->data.m_data.num = data->m_data.num; @@ -1475,11 +1516,17 @@ bool c_Map::update(int64_t h, TypedValue* data) { return true; } -bool c_Map::update(StringData *key, TypedValue* data) { +template +bool c_Map::updateImpl(StringData *key, TypedValue* data) { strhash_t h = key->hash(); Bucket* p = findForInsert(key->data(), key->size(), h); assert(p); if (p->validValue()) { + if (throwIfExists) { + Object e(SystemLib::AllocInvalidArgumentExceptionObject( + "An element with the same key already exists")); + throw e; + } tvRefcountedIncRef(data); tvRefcountedDecRef(&p->data); p->data.m_data.num = data->m_data.num; @@ -1698,9 +1745,9 @@ bool c_Map::OffsetContains(ObjectData* obj, TypedValue* key) { } void c_Map::OffsetAppend(ObjectData* obj, TypedValue* val) { - Object e(SystemLib::AllocRuntimeExceptionObject( - "[] operator not supported for Maps")); - throw e; + assert(val->m_type != KindOfRef); + auto mp = static_cast(obj); + mp->add(val); } void c_Map::OffsetUnset(ObjectData* obj, TypedValue* key) { @@ -1930,6 +1977,15 @@ ObjectData* c_StableMap::clone() { return obj; } +Object c_StableMap::t_add(CVarRef val) { + TypedValue* tv = (TypedValue*)(&val); + if (UNLIKELY(tv->m_type == KindOfRef)) { + tv = tv->m_data.pref->tv(); + } + add(tv); + return this; +} + Object c_StableMap::t_clear() { deleteBuckets(); freeData(); @@ -2303,6 +2359,32 @@ void c_StableMap::throwOOB(StringData* key) { throwStrOOB(key); } +void c_StableMap::add(TypedValue* val) { + if (UNLIKELY(val->m_type != KindOfObject || + !val->m_data.pobj->instanceof(c_Tuple::s_cls))) { + Object e(SystemLib::AllocInvalidArgumentExceptionObject( + "Parameter must be an instance of Tuple")); + throw e; + } + auto tup = static_cast(val->m_data.pobj); + if (UNLIKELY(tup->t_count() != 2)) { + Object e(SystemLib::AllocInvalidArgumentExceptionObject( + "Expected Tuple containing exactly two elements")); + throw e; + } + TypedValue* tvKey = &tup->getData()[0]; + TypedValue* tvValue = &tup->getData()[1]; + assert(tvKey->m_type != KindOfRef); + assert(tvValue->m_type != KindOfRef); + if (tvKey->m_type == KindOfInt64) { + updateImpl(tvKey->m_data.num, tvValue); + } else if (IS_STRING_TYPE(tvKey->m_type)) { + updateImpl(tvKey->m_data.pstr, tvValue); + } else { + throwBadKeyType(); + } +} + bool inline sm_hit_string_key(const c_StableMap::Bucket* p, const char* k, int len, int32_t hash) ALWAYS_INLINE; bool inline sm_hit_string_key(const c_StableMap::Bucket* p, @@ -2358,9 +2440,15 @@ c_StableMap::Bucket** c_StableMap::findForErase(const char* k, int len, return NULL; } -bool c_StableMap::update(int64_t h, TypedValue* data) { +template +bool c_StableMap::updateImpl(int64_t h, TypedValue* data) { Bucket* p = find(h); if (p) { + if (throwIfExists) { + Object e(SystemLib::AllocInvalidArgumentExceptionObject( + "An element with the same key already exists")); + throw e; + } tvRefcountedIncRef(data); tvRefcountedDecRef(&p->data); p->data.m_data.num = data->m_data.num; @@ -2380,10 +2468,16 @@ bool c_StableMap::update(int64_t h, TypedValue* data) { return true; } -bool c_StableMap::update(StringData *key, TypedValue* data) { +template +bool c_StableMap::updateImpl(StringData *key, TypedValue* data) { strhash_t h = key->hash(); Bucket* p = find(key->data(), key->size(), h); if (p) { + if (throwIfExists) { + Object e(SystemLib::AllocInvalidArgumentExceptionObject( + "An element with the same key already exists")); + throw e; + } tvRefcountedIncRef(data); tvRefcountedDecRef(&p->data); p->data.m_data.num = data->m_data.num; @@ -2754,9 +2848,9 @@ bool c_StableMap::OffsetContains(ObjectData* obj, TypedValue* key) { } void c_StableMap::OffsetAppend(ObjectData* obj, TypedValue* val) { - Object e(SystemLib::AllocRuntimeExceptionObject( - "[] operator not supported for StableMaps")); - throw e; + assert(val->m_type != KindOfRef); + auto smp = static_cast(obj); + smp->add(val); } void c_StableMap::OffsetUnset(ObjectData* obj, TypedValue* key) { diff --git a/hphp/runtime/ext/ext_collections.ext_hhvm.cpp b/hphp/runtime/ext/ext_collections.ext_hhvm.cpp index 9a4af6dfa..7c235b58e 100644 --- a/hphp/runtime/ext/ext_collections.ext_hhvm.cpp +++ b/hphp/runtime/ext/ext_collections.ext_hhvm.cpp @@ -2082,6 +2082,45 @@ TypedValue* tg_3Map_discard(HPHP::VM::ActRec *ar) { return &ar->m_r; } +/* +HPHP::Object HPHP::c_Map::t_add(HPHP::Variant const&) +_ZN4HPHP5c_Map5t_addERKNS_7VariantE + +(return value) => rax +_rv => rdi +this_ => rsi +val => rdx +*/ + +Value* th_3Map_add(Value* _rv, ObjectData* this_, TypedValue* val) asm("_ZN4HPHP5c_Map5t_addERKNS_7VariantE"); + +TypedValue* tg_3Map_add(HPHP::VM::ActRec *ar) { + TypedValue rv; + int64_t count = ar->numArgs(); + TypedValue* args UNUSED = ((TypedValue*)ar) - 1; + ObjectData* this_ = (ar->hasThis() ? ar->getThis() : NULL); + if (this_) { + if (count == 1LL) { + rv.m_type = KindOfObject; + th_3Map_add((&rv.m_data), (this_), (args-0)); + if (rv.m_data.num == 0LL) rv.m_type = KindOfNull; + frame_free_locals_inl(ar, 1); + memcpy(&ar->m_r, &rv, sizeof(TypedValue)); + return &ar->m_r; + } else { + throw_wrong_arguments_nr("Map::add", count, 1, 1, 1); + } + } else { + throw_instance_method_fatal("Map::add"); + } + rv.m_data.num = 0LL; + rv.m_type = KindOfNull; + frame_free_locals_inl(ar, 1); + memcpy(&ar->m_r, &rv, sizeof(TypedValue)); + return &ar->m_r; + return &ar->m_r; +} + /* HPHP::Array HPHP::c_Map::t_toarray() _ZN4HPHP5c_Map9t_toarrayEv @@ -3528,6 +3567,45 @@ TypedValue* tg_9StableMap_discard(HPHP::VM::ActRec *ar) { return &ar->m_r; } +/* +HPHP::Object HPHP::c_StableMap::t_add(HPHP::Variant const&) +_ZN4HPHP11c_StableMap5t_addERKNS_7VariantE + +(return value) => rax +_rv => rdi +this_ => rsi +val => rdx +*/ + +Value* th_9StableMap_add(Value* _rv, ObjectData* this_, TypedValue* val) asm("_ZN4HPHP11c_StableMap5t_addERKNS_7VariantE"); + +TypedValue* tg_9StableMap_add(HPHP::VM::ActRec *ar) { + TypedValue rv; + int64_t count = ar->numArgs(); + TypedValue* args UNUSED = ((TypedValue*)ar) - 1; + ObjectData* this_ = (ar->hasThis() ? ar->getThis() : NULL); + if (this_) { + if (count == 1LL) { + rv.m_type = KindOfObject; + th_9StableMap_add((&rv.m_data), (this_), (args-0)); + if (rv.m_data.num == 0LL) rv.m_type = KindOfNull; + frame_free_locals_inl(ar, 1); + memcpy(&ar->m_r, &rv, sizeof(TypedValue)); + return &ar->m_r; + } else { + throw_wrong_arguments_nr("StableMap::add", count, 1, 1, 1); + } + } else { + throw_instance_method_fatal("StableMap::add"); + } + rv.m_data.num = 0LL; + rv.m_type = KindOfNull; + frame_free_locals_inl(ar, 1); + memcpy(&ar->m_r, &rv, sizeof(TypedValue)); + return &ar->m_r; + return &ar->m_r; +} + /* HPHP::Array HPHP::c_StableMap::t_toarray() _ZN4HPHP11c_StableMap9t_toarrayEv diff --git a/hphp/runtime/ext/ext_collections.h b/hphp/runtime/ext/ext_collections.h index 0555e43fd..7974b20af 100644 --- a/hphp/runtime/ext/ext_collections.h +++ b/hphp/runtime/ext/ext_collections.h @@ -227,6 +227,7 @@ class c_Map : public ExtObjectDataFlagsm_type != KindOfRef); update(key, val); } + public: void add(TypedValue* val); public: void remove(int64_t key) { ++m_versionNumber; erase(find(key)); @@ -457,8 +459,16 @@ private: Bucket* findForInsert(const char* k, int len, strhash_t prehash) const; Bucket* findForNewInsert(size_t h0) const; - bool update(int64_t h, TypedValue* data); - bool update(StringData* key, TypedValue* data); + template + bool updateImpl(int64_t h, TypedValue* data); + template + bool updateImpl(StringData* key, TypedValue* data); + bool update(int64_t h, TypedValue* data) { + return updateImpl<>(h, data); + } + bool update(StringData* key, TypedValue* data) { + return updateImpl<>(key, data); + } void erase(Bucket* prev); void resize(); @@ -523,6 +533,7 @@ class c_StableMap : public ExtObjectDataFlags + bool updateImpl(int64_t h, TypedValue* data); + template + bool updateImpl(StringData* key, TypedValue* data); + bool update(int64_t h, TypedValue* data) { + return updateImpl<>(h, data); + } + bool update(StringData* key, TypedValue* data) { + return updateImpl<>(key, data); + } void erase(Bucket** prev); void resize(); diff --git a/hphp/runtime/ext_hhvm/ext_hhvm_infotabs.cpp b/hphp/runtime/ext_hhvm/ext_hhvm_infotabs.cpp index 5cb9a0dce..ef5fa4b36 100644 --- a/hphp/runtime/ext_hhvm/ext_hhvm_infotabs.cpp +++ b/hphp/runtime/ext_hhvm/ext_hhvm_infotabs.cpp @@ -2330,6 +2330,7 @@ TypedValue* tg_3Map_containsKey(VM::ActRec *ar); TypedValue* tg_3Map_remove(VM::ActRec *ar); TypedValue* tg_3Map_removeKey(VM::ActRec *ar); TypedValue* tg_3Map_discard(VM::ActRec *ar); +TypedValue* tg_3Map_add(VM::ActRec *ar); TypedValue* tg_3Map_toArray(VM::ActRec *ar); TypedValue* tg_3Map_copyAsArray(VM::ActRec *ar); TypedValue* tg_3Map_toKeysArray(VM::ActRec *ar); @@ -2370,6 +2371,7 @@ TypedValue* tg_9StableMap_containsKey(VM::ActRec *ar); TypedValue* tg_9StableMap_remove(VM::ActRec *ar); TypedValue* tg_9StableMap_removeKey(VM::ActRec *ar); TypedValue* tg_9StableMap_discard(VM::ActRec *ar); +TypedValue* tg_9StableMap_add(VM::ActRec *ar); TypedValue* tg_9StableMap_toArray(VM::ActRec *ar); TypedValue* tg_9StableMap_copyAsArray(VM::ActRec *ar); TypedValue* tg_9StableMap_toKeysArray(VM::ActRec *ar); @@ -5375,7 +5377,7 @@ static const HhbcExtMethodInfo hhbc_ext_methods_VectorIterator[] = { { "rewind", tg_14VectorIterator_rewind } }; -static const long long hhbc_ext_method_count_Map = 32; +static const long long hhbc_ext_method_count_Map = 33; static const HhbcExtMethodInfo hhbc_ext_methods_Map[] = { { "__construct", tg_3Map___construct }, { "isEmpty", tg_3Map_isEmpty }, @@ -5392,6 +5394,7 @@ static const HhbcExtMethodInfo hhbc_ext_methods_Map[] = { { "remove", tg_3Map_remove }, { "removeKey", tg_3Map_removeKey }, { "discard", tg_3Map_discard }, + { "add", tg_3Map_add }, { "toArray", tg_3Map_toArray }, { "copyAsArray", tg_3Map_copyAsArray }, { "toKeysArray", tg_3Map_toKeysArray }, @@ -5421,7 +5424,7 @@ static const HhbcExtMethodInfo hhbc_ext_methods_MapIterator[] = { { "rewind", tg_11MapIterator_rewind } }; -static const long long hhbc_ext_method_count_StableMap = 32; +static const long long hhbc_ext_method_count_StableMap = 33; static const HhbcExtMethodInfo hhbc_ext_methods_StableMap[] = { { "__construct", tg_9StableMap___construct }, { "isEmpty", tg_9StableMap_isEmpty }, @@ -5438,6 +5441,7 @@ static const HhbcExtMethodInfo hhbc_ext_methods_StableMap[] = { { "remove", tg_9StableMap_remove }, { "removeKey", tg_9StableMap_removeKey }, { "discard", tg_9StableMap_discard }, + { "add", tg_9StableMap_add }, { "toArray", tg_9StableMap_toArray }, { "copyAsArray", tg_9StableMap_copyAsArray }, { "toKeysArray", tg_9StableMap_toKeysArray }, diff --git a/hphp/system/class_map.cpp b/hphp/system/class_map.cpp index 950ff57c0..19d0a9fd6 100644 --- a/hphp/system/class_map.cpp +++ b/hphp/system/class_map.cpp @@ -22464,7 +22464,7 @@ const char *g_class_map[] = { NULL, NULL, (const char *)0x10006040, "add", "", (const char*)0, (const char*)0, - "/**\n * ( excerpt from http://php.net/manual/en/vector.add.php )\n *\n *\n * @val mixed\n *\n * @return object\n */", + "/**\n * ( excerpt from http://php.net/manual/en/vector.add.php )\n *\n * Adds the specified value to the end of this Vector using the next\n * available integer key.\n *\n * @val mixed\n *\n * @return object\n */", (const char *)0x40, (const char *)0x2000, "val", "", (const char *)0xffffffff, "", "", NULL, NULL, NULL, @@ -22708,6 +22708,12 @@ const char *g_class_map[] = { NULL, NULL, NULL, + (const char *)0x10006040, "add", "", (const char*)0, (const char*)0, + "/**\n * ( excerpt from http://php.net/manual/en/map.add.php )\n *\n * Adds the specified key/value Tuple to this Map. If an element with the\n * same key is already present, an exception is thrown.\n *\n * @val mixed\n *\n * @return object\n */", + (const char *)0x40, (const char *)0x2000, "val", "", (const char *)0xffffffff, "", "", NULL, + NULL, + NULL, + NULL, (const char *)0x10006040, "toArray", "", (const char*)0, (const char*)0, "/**\n * ( excerpt from http://php.net/manual/en/map.toarray.php )\n *\n * Returns an array built from the keys and values from this Map.\n *\n * @return map\n */", (const char *)0x20, NULL, @@ -22935,6 +22941,12 @@ const char *g_class_map[] = { NULL, NULL, NULL, + (const char *)0x10006040, "add", "", (const char*)0, (const char*)0, + "/**\n * ( excerpt from http://php.net/manual/en/stablemap.add.php )\n *\n * Adds the specified key/value Tuple to this StableMap. If an element\n * with the same key is already present, an exception is thrown.\n *\n * @val mixed\n *\n * @return object\n */", + (const char *)0x40, (const char *)0x2000, "val", "", (const char *)0xffffffff, "", "", NULL, + NULL, + NULL, + NULL, (const char *)0x10006040, "toArray", "", (const char*)0, (const char*)0, "/**\n * ( excerpt from http://php.net/manual/en/stablemap.toarray.php )\n *\n * Returns an array built from the keys and values from this StableMap.\n *\n * @return map\n */", (const char *)0x20, NULL, diff --git a/hphp/system/collections.inc b/hphp/system/collections.inc index dbba4d1b2..9e8d2b762 100644 --- a/hphp/system/collections.inc +++ b/hphp/system/collections.inc @@ -5,11 +5,11 @@ #elif EXT_TYPE == 1 #elif EXT_TYPE == 2 -"Vector", "", "keyediterable","countable",NULL, "__construct", T(Void), S(0), "iterable", T(Variant), "N;", S(2), "null", S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.construct.php )\n *\n * Returns a Vector built from the values produced by the specified\n * Iterable.\n *\n * @iterable mixed\n */", S(16384),"isEmpty", T(Boolean), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.isempty.php )\n *\n * Returns true if the Vector is empty, false otherwise.\n *\n * @return bool\n */", S(16384),"count", T(Int64), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.count.php )\n *\n * Returns the number of values in the Vector.\n *\n * @return int\n */", S(16384),"items", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.items.php )\n *\n * Returns an Iterable that produces the values from this Vector.\n *\n * @return object\n */", S(16384),"keys", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.keys.php )\n *\n * Returns an Iterable that produces the keys from this Vector.\n *\n * @return object\n */", S(16384),"at", T(Variant), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.at.php )\n *\n * Returns the value at the specified key. If the key is not present, an\n * exception is thrown.\n *\n * @key mixed\n *\n * @return mixed\n */", S(16384),"get", T(Variant), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.get.php )\n *\n * Returns the value at the specified key. If the key is not present, null\n * is returned.\n *\n * @key mixed\n *\n * @return mixed\n */", S(16384),"set", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), "value", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.set.php )\n *\n * Stores a value into the Vector with the specified key, overwriting any\n * previous value that was associated with the key. If the key is outside\n * the bounds of the Vector, an exception is thrown.\n *\n * @key mixed\n * @value mixed\n *\n * @return object\n */", S(16384),"put", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), "value", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.put.php )\n *\n * Stores a value into the Vector with the specified key, overwriting any\n * previous value that was associated with the key. If the key is outside\n * the bounds of the Vector, an exception is thrown.\n *\n * @key mixed\n * @value mixed\n *\n * @return object\n */", S(16384),"clear", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.clear.php )\n *\n * Removes all values from the Vector.\n *\n * @return object\n */", S(16384),"contains", T(Boolean), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.contains.php )\n *\n * Returns true if the specified key is present in the Vector, returns\n * false otherwise.\n *\n * @key mixed\n *\n * @return bool\n */", S(16384),"containsKey", T(Boolean), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.containskey.php )\n *\n * Returns true if the specified key is present in the Vector, returns\n * false otherwise.\n *\n * @key mixed\n *\n * @return bool\n */", S(16384),"removeKey", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.removekey.php )\n *\n * Removes the element with the specified key from this Vector and\n * renumbers the keys of all subsequent elements.\n *\n * @key mixed\n *\n * @return object\n */", S(16384),"append", T(Object), S(0), "val", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.append.php )\n *\n *\n * @val mixed\n *\n * @return object\n */", S(16384),"add", T(Object), S(0), "val", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.add.php )\n *\n *\n * @val mixed\n *\n * @return object\n */", S(16384),"pop", T(Variant), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.pop.php )\n *\n *\n * @return mixed\n */", S(16384),"resize", T(Void), S(0), "sz", T(Variant), NULL, S(0), NULL, S(0), "value", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.resize.php )\n *\n *\n * @sz mixed\n * @value mixed\n */", S(16384),"toArray", T(Array), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.toarray.php )\n *\n * Returns an array built from the values from this Vector.\n *\n * @return map\n */", S(16384),"getIterator", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.getiterator.php )\n *\n * Returns an iterator that points to beginning of this Vector.\n *\n * @return object\n */", S(16384),"sort", T(Void), S(0), "col", T(Variant), "N;", S(2), "null", S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.sort.php )\n *\n * Uses the specified Collator to sort the Vector in place.\n *\n * @col mixed\n */", S(16384),"reverse", T(Void), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.reverse.php )\n *\n * Reverses the values of the Vector in place.\n *\n */", S(16384),"splice", T(Void), S(0), "offset", T(Variant), NULL, S(0), NULL, S(0), "len", T(Variant), "N;", S(2), "null", S(0), "replacement", T(Variant), "N;", S(2), "null", S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.splice.php )\n *\n * Splices the values of the Vector in place (see the documentation for\n * array_splice() on php.net for more details.\n *\n * @offset mixed\n * @len mixed\n * @replacement\n * mixed\n */", S(16384),"linearSearch", T(Int64), S(0), "search_value", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.linearsearch.php )\n *\n * Returns index of the specified value if it is present, -1 otherwise.\n *\n * @search_value\n * mixed\n *\n * @return int\n */", S(16384),"shuffle", T(Void), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.shuffle.php )\n *\n * Shuffles the values of the Vector randomly in place.\n *\n */", S(16384),"__toString", T(String), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.tostring.php )\n *\n *\n * @return string\n */", S(16384),"__get", T(Variant), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.get.php )\n *\n *\n * @name mixed\n *\n * @return mixed\n */", S(16384),"__set", T(Variant), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), "value", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.set.php )\n *\n *\n * @name mixed\n * @value mixed\n *\n * @return mixed\n */", S(16384),"__isset", T(Boolean), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.isset.php )\n *\n *\n * @name mixed\n *\n * @return bool\n */", S(16384),"__unset", T(Variant), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.unset.php )\n *\n *\n * @name mixed\n *\n * @return mixed\n */", S(16384),"fromItems", T(Object), S(0), "iterable", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16896), "/**\n * ( excerpt from http://php.net/manual/en/vector.fromitems.php )\n *\n * Returns a Vector built from the values produced by the specified\n * Iterable.\n *\n * @iterable mixed\n *\n * @return object\n */", S(16896),"fromArray", T(Object), S(0), "arr", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16896), "/**\n * ( excerpt from http://php.net/manual/en/vector.fromarray.php )\n *\n * Returns a Vector built from the values from the specified array.\n *\n * @arr mixed\n *\n * @return object\n */", S(16896),"fromVector", T(Object), S(0), "vec", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16896), "/**\n * ( excerpt from http://php.net/manual/en/vector.fromvector.php )\n *\n * Returns a copy of the specified Vector.\n *\n * @vec mixed\n *\n * @return object\n */", S(16896),"slice", T(Object), S(0), "vec", T(Variant), NULL, S(0), NULL, S(0), "offset", T(Variant), NULL, S(0), NULL, S(0), "len", T(Variant), "N;", S(2), "null", S(0), NULL, S(16896), "/**\n * ( excerpt from http://php.net/manual/en/vector.slice.php )\n *\n * Returns a Vector built from the specified slice of values from the\n * specified Vector.\n *\n * @vec mixed\n * @offset mixed\n * @len mixed\n *\n * @return object\n */", S(16896),NULL,NULL,NULL, +"Vector", "", "keyediterable","countable",NULL, "__construct", T(Void), S(0), "iterable", T(Variant), "N;", S(2), "null", S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.construct.php )\n *\n * Returns a Vector built from the values produced by the specified\n * Iterable.\n *\n * @iterable mixed\n */", S(16384),"isEmpty", T(Boolean), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.isempty.php )\n *\n * Returns true if the Vector is empty, false otherwise.\n *\n * @return bool\n */", S(16384),"count", T(Int64), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.count.php )\n *\n * Returns the number of values in the Vector.\n *\n * @return int\n */", S(16384),"items", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.items.php )\n *\n * Returns an Iterable that produces the values from this Vector.\n *\n * @return object\n */", S(16384),"keys", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.keys.php )\n *\n * Returns an Iterable that produces the keys from this Vector.\n *\n * @return object\n */", S(16384),"at", T(Variant), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.at.php )\n *\n * Returns the value at the specified key. If the key is not present, an\n * exception is thrown.\n *\n * @key mixed\n *\n * @return mixed\n */", S(16384),"get", T(Variant), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.get.php )\n *\n * Returns the value at the specified key. If the key is not present, null\n * is returned.\n *\n * @key mixed\n *\n * @return mixed\n */", S(16384),"set", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), "value", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.set.php )\n *\n * Stores a value into the Vector with the specified key, overwriting any\n * previous value that was associated with the key. If the key is outside\n * the bounds of the Vector, an exception is thrown.\n *\n * @key mixed\n * @value mixed\n *\n * @return object\n */", S(16384),"put", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), "value", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.put.php )\n *\n * Stores a value into the Vector with the specified key, overwriting any\n * previous value that was associated with the key. If the key is outside\n * the bounds of the Vector, an exception is thrown.\n *\n * @key mixed\n * @value mixed\n *\n * @return object\n */", S(16384),"clear", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.clear.php )\n *\n * Removes all values from the Vector.\n *\n * @return object\n */", S(16384),"contains", T(Boolean), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.contains.php )\n *\n * Returns true if the specified key is present in the Vector, returns\n * false otherwise.\n *\n * @key mixed\n *\n * @return bool\n */", S(16384),"containsKey", T(Boolean), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.containskey.php )\n *\n * Returns true if the specified key is present in the Vector, returns\n * false otherwise.\n *\n * @key mixed\n *\n * @return bool\n */", S(16384),"removeKey", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.removekey.php )\n *\n * Removes the element with the specified key from this Vector and\n * renumbers the keys of all subsequent elements.\n *\n * @key mixed\n *\n * @return object\n */", S(16384),"append", T(Object), S(0), "val", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.append.php )\n *\n *\n * @val mixed\n *\n * @return object\n */", S(16384),"add", T(Object), S(0), "val", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.add.php )\n *\n * Adds the specified value to the end of this Vector using the next\n * available integer key.\n *\n * @val mixed\n *\n * @return object\n */", S(16384),"pop", T(Variant), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.pop.php )\n *\n *\n * @return mixed\n */", S(16384),"resize", T(Void), S(0), "sz", T(Variant), NULL, S(0), NULL, S(0), "value", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.resize.php )\n *\n *\n * @sz mixed\n * @value mixed\n */", S(16384),"toArray", T(Array), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.toarray.php )\n *\n * Returns an array built from the values from this Vector.\n *\n * @return map\n */", S(16384),"getIterator", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.getiterator.php )\n *\n * Returns an iterator that points to beginning of this Vector.\n *\n * @return object\n */", S(16384),"sort", T(Void), S(0), "col", T(Variant), "N;", S(2), "null", S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.sort.php )\n *\n * Uses the specified Collator to sort the Vector in place.\n *\n * @col mixed\n */", S(16384),"reverse", T(Void), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.reverse.php )\n *\n * Reverses the values of the Vector in place.\n *\n */", S(16384),"splice", T(Void), S(0), "offset", T(Variant), NULL, S(0), NULL, S(0), "len", T(Variant), "N;", S(2), "null", S(0), "replacement", T(Variant), "N;", S(2), "null", S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.splice.php )\n *\n * Splices the values of the Vector in place (see the documentation for\n * array_splice() on php.net for more details.\n *\n * @offset mixed\n * @len mixed\n * @replacement\n * mixed\n */", S(16384),"linearSearch", T(Int64), S(0), "search_value", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.linearsearch.php )\n *\n * Returns index of the specified value if it is present, -1 otherwise.\n *\n * @search_value\n * mixed\n *\n * @return int\n */", S(16384),"shuffle", T(Void), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.shuffle.php )\n *\n * Shuffles the values of the Vector randomly in place.\n *\n */", S(16384),"__toString", T(String), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.tostring.php )\n *\n *\n * @return string\n */", S(16384),"__get", T(Variant), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.get.php )\n *\n *\n * @name mixed\n *\n * @return mixed\n */", S(16384),"__set", T(Variant), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), "value", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.set.php )\n *\n *\n * @name mixed\n * @value mixed\n *\n * @return mixed\n */", S(16384),"__isset", T(Boolean), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.isset.php )\n *\n *\n * @name mixed\n *\n * @return bool\n */", S(16384),"__unset", T(Variant), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vector.unset.php )\n *\n *\n * @name mixed\n *\n * @return mixed\n */", S(16384),"fromItems", T(Object), S(0), "iterable", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16896), "/**\n * ( excerpt from http://php.net/manual/en/vector.fromitems.php )\n *\n * Returns a Vector built from the values produced by the specified\n * Iterable.\n *\n * @iterable mixed\n *\n * @return object\n */", S(16896),"fromArray", T(Object), S(0), "arr", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16896), "/**\n * ( excerpt from http://php.net/manual/en/vector.fromarray.php )\n *\n * Returns a Vector built from the values from the specified array.\n *\n * @arr mixed\n *\n * @return object\n */", S(16896),"fromVector", T(Object), S(0), "vec", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16896), "/**\n * ( excerpt from http://php.net/manual/en/vector.fromvector.php )\n *\n * Returns a copy of the specified Vector.\n *\n * @vec mixed\n *\n * @return object\n */", S(16896),"slice", T(Object), S(0), "vec", T(Variant), NULL, S(0), NULL, S(0), "offset", T(Variant), NULL, S(0), NULL, S(0), "len", T(Variant), "N;", S(2), "null", S(0), NULL, S(16896), "/**\n * ( excerpt from http://php.net/manual/en/vector.slice.php )\n *\n * Returns a Vector built from the specified slice of values from the\n * specified Vector.\n *\n * @vec mixed\n * @offset mixed\n * @len mixed\n *\n * @return object\n */", S(16896),NULL,NULL,NULL, S(16416), "/**\n * ( excerpt from http://php.net/manual/en/class.vector.php )\n *\n * An ordered collection where values are keyed using integers 0 thru n-1\n * in order.\n *\n */", "VectorIterator", "", "keyediterator",NULL, "__construct", T(Void), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vectoriterator.construct.php )\n *\n *\n */", S(16384),"current", T(Variant), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vectoriterator.current.php )\n *\n * Returns the current value that the iterator points to.\n *\n * @return mixed\n */", S(16384),"key", T(Variant), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vectoriterator.key.php )\n *\n * Returns the current key that the iterator points to.\n *\n * @return mixed\n */", S(16384),"valid", T(Boolean), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vectoriterator.valid.php )\n *\n * Returns true if the iterator points to a valid value, returns false\n * otherwise.\n *\n * @return bool\n */", S(16384),"next", T(Void), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vectoriterator.next.php )\n *\n * Advance this iterator forward one position.\n *\n */", S(16384),"rewind", T(Void), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/vectoriterator.rewind.php )\n *\n * Move this iterator back to the first position.\n *\n */", S(16384),NULL,NULL,NULL, -S(16416), "/**\n * ( excerpt from http://php.net/manual/en/class.vectoriterator.php )\n *\n * An iterator implementation for iterating over a Vector.\n *\n */", "Map", "", "keyediterable","countable",NULL, "__construct", T(Void), S(0), "iterable", T(Variant), "N;", S(2), "null", S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.construct.php )\n *\n * Returns a Map built from the keys and values produced by the specified\n * KeyedIterable.\n *\n * @iterable mixed\n */", S(16384),"isEmpty", T(Boolean), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.isempty.php )\n *\n * Returns true if the Map is empty, false otherwise.\n *\n * @return bool\n */", S(16384),"count", T(Int64), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.count.php )\n *\n * Returns the number of key/value pairs in the Map.\n *\n * @return int\n */", S(16384),"items", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.items.php )\n *\n * Returns an Iterable that produces the key/value pairs as Tuples from\n * this Map.\n *\n * @return object\n */", S(16384),"keys", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.keys.php )\n *\n * Returns an Iterable that produces the keys from this Map.\n *\n * @return object\n */", S(16384),"at", T(Variant), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.at.php )\n *\n * Returns the value at the specified key. If the key is not present, an\n * exception is thrown.\n *\n * @key mixed\n *\n * @return mixed\n */", S(16384),"get", T(Variant), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.get.php )\n *\n * Returns the value at the specified key. If the key is not present, null\n * is returned.\n *\n * @key mixed\n *\n * @return mixed\n */", S(16384),"set", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), "value", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.set.php )\n *\n * Stores a value into the Map with the specified key, overwriting any\n * previous value that was associated with the key.\n *\n * @key mixed\n * @value mixed\n *\n * @return object\n */", S(16384),"put", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), "value", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.put.php )\n *\n * Stores a value into the Map with the specified key, overwriting any\n * previous value that was associated with the key.\n *\n * @key mixed\n * @value mixed\n *\n * @return object\n */", S(16384),"clear", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.clear.php )\n *\n * Removes all key/value pairs from the Map.\n *\n * @return object\n */", S(16384),"contains", T(Boolean), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.contains.php )\n *\n * Returns true if the specified key is present in the Map, false\n * otherwise.\n *\n * @key mixed\n *\n * @return bool\n */", S(16384),"containsKey", T(Boolean), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.containskey.php )\n *\n * Returns true if the specified key is present in the Map, false\n * otherwise.\n *\n * @key mixed\n *\n * @return bool\n */", S(16384),"remove", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.remove.php )\n *\n * Removes the specified key from this Map.\n *\n * @key mixed\n *\n * @return object\n */", S(16384),"removeKey", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.removekey.php )\n *\n * Removes the specified key from this Map.\n *\n * @key mixed\n *\n * @return object\n */", S(16384),"discard", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.discard.php )\n *\n * Removes the specified key from this Map.\n *\n * @key mixed\n *\n * @return object\n */", S(16384),"toArray", T(Array), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.toarray.php )\n *\n * Returns an array built from the keys and values from this Map.\n *\n * @return map\n */", S(16384),"copyAsArray", T(Array), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.copyasarray.php )\n *\n * Returns an array built from the keys and values from this Map.\n *\n * @return map\n */", S(16384),"toKeysArray", T(Array), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.tokeysarray.php )\n *\n * Returns an array built from the keys from this Map.\n *\n * @return map\n */", S(16384),"values", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.values.php )\n *\n * Returns a Vector built from the values from this Map.\n *\n * @return object\n */", S(16384),"toValuesArray", T(Array), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.tovaluesarray.php )\n *\n * Returns an array built from the values from this Map.\n *\n * @return map\n */", S(16384),"updateFromArray", T(Object), S(0), "arr", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.updatefromarray.php )\n *\n * Inserts the keys and values from the specified array into this Map.\n *\n * @arr mixed\n *\n * @return object\n */", S(16384),"updateFromIterable", T(Object), S(0), "it", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.updatefromiterable.php )\n *\n * Inserts the keys and values produced by the specified KeyedIterable.\n *\n * @it mixed\n *\n * @return object\n */", S(16384),"differenceByKey", T(Object), S(0), "it", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.differencebykey.php )\n *\n *\n * @it mixed\n *\n * @return object\n */", S(16384),"getIterator", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.getiterator.php )\n *\n * Returns an iterator that points to beginning of this Map.\n *\n * @return object\n */", S(16384),"__toString", T(String), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.tostring.php )\n *\n *\n * @return string\n */", S(16384),"__get", T(Variant), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.get.php )\n *\n *\n * @name mixed\n *\n * @return mixed\n */", S(16384),"__set", T(Variant), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), "value", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.set.php )\n *\n *\n * @name mixed\n * @value mixed\n *\n * @return mixed\n */", S(16384),"__isset", T(Boolean), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.isset.php )\n *\n *\n * @name mixed\n *\n * @return bool\n */", S(16384),"__unset", T(Variant), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.unset.php )\n *\n *\n * @name mixed\n *\n * @return mixed\n */", S(16384),"fromItems", T(Object), S(0), "iterable", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16896), "/**\n * ( excerpt from http://php.net/manual/en/map.fromitems.php )\n *\n * Returns a Map built from the key/value Tuples produced by the specified\n * Iterable.\n *\n * @iterable mixed\n *\n * @return object\n */", S(16896),"fromArray", T(Object), S(0), "mp", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16896), "/**\n * ( excerpt from http://php.net/manual/en/map.fromarray.php )\n *\n * Returns a Map built from the keys and values from the specified array.\n *\n * @mp mixed\n *\n * @return object\n */", S(16896),"fromIterable", T(Object), S(0), "mp", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16896), "/**\n * ( excerpt from http://php.net/manual/en/map.fromiterable.php )\n *\n * Returns a Map built from the keys and values produced by the specified\n * KeyedIterable.\n *\n * @mp mixed\n *\n * @return object\n */", S(16896),NULL,NULL,NULL, +S(16416), "/**\n * ( excerpt from http://php.net/manual/en/class.vectoriterator.php )\n *\n * An iterator implementation for iterating over a Vector.\n *\n */", "Map", "", "keyediterable","countable",NULL, "__construct", T(Void), S(0), "iterable", T(Variant), "N;", S(2), "null", S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.construct.php )\n *\n * Returns a Map built from the keys and values produced by the specified\n * KeyedIterable.\n *\n * @iterable mixed\n */", S(16384),"isEmpty", T(Boolean), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.isempty.php )\n *\n * Returns true if the Map is empty, false otherwise.\n *\n * @return bool\n */", S(16384),"count", T(Int64), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.count.php )\n *\n * Returns the number of key/value pairs in the Map.\n *\n * @return int\n */", S(16384),"items", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.items.php )\n *\n * Returns an Iterable that produces the key/value pairs as Tuples from\n * this Map.\n *\n * @return object\n */", S(16384),"keys", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.keys.php )\n *\n * Returns an Iterable that produces the keys from this Map.\n *\n * @return object\n */", S(16384),"at", T(Variant), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.at.php )\n *\n * Returns the value at the specified key. If the key is not present, an\n * exception is thrown.\n *\n * @key mixed\n *\n * @return mixed\n */", S(16384),"get", T(Variant), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.get.php )\n *\n * Returns the value at the specified key. If the key is not present, null\n * is returned.\n *\n * @key mixed\n *\n * @return mixed\n */", S(16384),"set", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), "value", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.set.php )\n *\n * Stores a value into the Map with the specified key, overwriting any\n * previous value that was associated with the key.\n *\n * @key mixed\n * @value mixed\n *\n * @return object\n */", S(16384),"put", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), "value", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.put.php )\n *\n * Stores a value into the Map with the specified key, overwriting any\n * previous value that was associated with the key.\n *\n * @key mixed\n * @value mixed\n *\n * @return object\n */", S(16384),"clear", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.clear.php )\n *\n * Removes all key/value pairs from the Map.\n *\n * @return object\n */", S(16384),"contains", T(Boolean), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.contains.php )\n *\n * Returns true if the specified key is present in the Map, false\n * otherwise.\n *\n * @key mixed\n *\n * @return bool\n */", S(16384),"containsKey", T(Boolean), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.containskey.php )\n *\n * Returns true if the specified key is present in the Map, false\n * otherwise.\n *\n * @key mixed\n *\n * @return bool\n */", S(16384),"remove", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.remove.php )\n *\n * Removes the specified key from this Map.\n *\n * @key mixed\n *\n * @return object\n */", S(16384),"removeKey", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.removekey.php )\n *\n * Removes the specified key from this Map.\n *\n * @key mixed\n *\n * @return object\n */", S(16384),"discard", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.discard.php )\n *\n * Removes the specified key from this Map.\n *\n * @key mixed\n *\n * @return object\n */", S(16384),"add", T(Object), S(0), "val", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.add.php )\n *\n * Adds the specified key/value Tuple to this Map. If an element with the\n * same key is already present, an exception is thrown.\n *\n * @val mixed\n *\n * @return object\n */", S(16384),"toArray", T(Array), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.toarray.php )\n *\n * Returns an array built from the keys and values from this Map.\n *\n * @return map\n */", S(16384),"copyAsArray", T(Array), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.copyasarray.php )\n *\n * Returns an array built from the keys and values from this Map.\n *\n * @return map\n */", S(16384),"toKeysArray", T(Array), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.tokeysarray.php )\n *\n * Returns an array built from the keys from this Map.\n *\n * @return map\n */", S(16384),"values", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.values.php )\n *\n * Returns a Vector built from the values from this Map.\n *\n * @return object\n */", S(16384),"toValuesArray", T(Array), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.tovaluesarray.php )\n *\n * Returns an array built from the values from this Map.\n *\n * @return map\n */", S(16384),"updateFromArray", T(Object), S(0), "arr", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.updatefromarray.php )\n *\n * Inserts the keys and values from the specified array into this Map.\n *\n * @arr mixed\n *\n * @return object\n */", S(16384),"updateFromIterable", T(Object), S(0), "it", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.updatefromiterable.php )\n *\n * Inserts the keys and values produced by the specified KeyedIterable.\n *\n * @it mixed\n *\n * @return object\n */", S(16384),"differenceByKey", T(Object), S(0), "it", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.differencebykey.php )\n *\n *\n * @it mixed\n *\n * @return object\n */", S(16384),"getIterator", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.getiterator.php )\n *\n * Returns an iterator that points to beginning of this Map.\n *\n * @return object\n */", S(16384),"__toString", T(String), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.tostring.php )\n *\n *\n * @return string\n */", S(16384),"__get", T(Variant), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.get.php )\n *\n *\n * @name mixed\n *\n * @return mixed\n */", S(16384),"__set", T(Variant), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), "value", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.set.php )\n *\n *\n * @name mixed\n * @value mixed\n *\n * @return mixed\n */", S(16384),"__isset", T(Boolean), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.isset.php )\n *\n *\n * @name mixed\n *\n * @return bool\n */", S(16384),"__unset", T(Variant), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/map.unset.php )\n *\n *\n * @name mixed\n *\n * @return mixed\n */", S(16384),"fromItems", T(Object), S(0), "iterable", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16896), "/**\n * ( excerpt from http://php.net/manual/en/map.fromitems.php )\n *\n * Returns a Map built from the key/value Tuples produced by the specified\n * Iterable.\n *\n * @iterable mixed\n *\n * @return object\n */", S(16896),"fromArray", T(Object), S(0), "mp", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16896), "/**\n * ( excerpt from http://php.net/manual/en/map.fromarray.php )\n *\n * Returns a Map built from the keys and values from the specified array.\n *\n * @mp mixed\n *\n * @return object\n */", S(16896),"fromIterable", T(Object), S(0), "mp", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16896), "/**\n * ( excerpt from http://php.net/manual/en/map.fromiterable.php )\n *\n * Returns a Map built from the keys and values produced by the specified\n * KeyedIterable.\n *\n * @mp mixed\n *\n * @return object\n */", S(16896),NULL,NULL,NULL, S(16416), "/**\n * ( excerpt from http://php.net/manual/en/class.map.php )\n *\n * An unordered dictionary-style collection.\n *\n */", "MapIterator", "", "keyediterator",NULL, "__construct", T(Void), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/mapiterator.construct.php )\n *\n *\n */", S(16384),"current", T(Variant), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/mapiterator.current.php )\n *\n * Returns the current value that the iterator points to.\n *\n * @return mixed\n */", S(16384),"key", T(Variant), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/mapiterator.key.php )\n *\n * Returns the current key that the iterator points to.\n *\n * @return mixed\n */", S(16384),"valid", T(Boolean), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/mapiterator.valid.php )\n *\n * Returns true if the iterator points to a valid value, returns false\n * otherwise.\n *\n * @return bool\n */", S(16384),"next", T(Void), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/mapiterator.next.php )\n *\n * Advance this iterator forward one position.\n *\n */", S(16384),"rewind", T(Void), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/mapiterator.rewind.php )\n *\n * Move this iterator back to the first position.\n *\n */", S(16384),NULL,NULL,NULL, -S(16416), "/**\n * ( excerpt from http://php.net/manual/en/class.mapiterator.php )\n *\n * An iterator implementation for iterating over a Map.\n *\n */", "StableMap", "", "keyediterable","countable",NULL, "__construct", T(Void), S(0), "iterable", T(Variant), "N;", S(2), "null", S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.construct.php )\n *\n * Returns a StableMap built from the keys and values produced by the\n * specified KeyedIterable.\n *\n * @iterable mixed\n */", S(16384),"isEmpty", T(Boolean), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.isempty.php )\n *\n * Returns true if the StableMap is empty, false otherwise.\n *\n * @return bool\n */", S(16384),"count", T(Int64), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.count.php )\n *\n * Returns the number of key/value pairs in the StableMap.\n *\n * @return int\n */", S(16384),"items", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.items.php )\n *\n * Returns an Iterable that produces the key/value pairs as Tuples from\n * this StableMap.\n *\n * @return object\n */", S(16384),"keys", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.keys.php )\n *\n * Returns an Iterable that produces the keys from this StableMap.\n *\n * @return object\n */", S(16384),"at", T(Variant), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.at.php )\n *\n * Returns the value at the specified key. If the key is not present, an\n * exception is thrown.\n *\n * @key mixed\n *\n * @return mixed\n */", S(16384),"get", T(Variant), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.get.php )\n *\n * Returns the value at the specified key. If the key is not present, null\n * is returned.\n *\n * @key mixed\n *\n * @return mixed\n */", S(16384),"set", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), "value", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.set.php )\n *\n * Stores a value into the StableMap with the specified key, overwriting\n * any previous value that was associated with the key.\n *\n * @key mixed\n * @value mixed\n *\n * @return object\n */", S(16384),"put", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), "value", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.put.php )\n *\n * Stores a value into the StableMap with the specified key, overwriting\n * any previous value that was associated with the key.\n *\n * @key mixed\n * @value mixed\n *\n * @return object\n */", S(16384),"clear", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.clear.php )\n *\n * Removes all key/value pairs from the StableMap.\n *\n * @return object\n */", S(16384),"contains", T(Boolean), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.contains.php )\n *\n * Returns true if the specified key is present in the StableMap, false\n * otherwise.\n *\n * @key mixed\n *\n * @return bool\n */", S(16384),"containsKey", T(Boolean), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.containskey.php )\n *\n * Returns true if the specified key is present in the StableMap, false\n * otherwise.\n *\n * @key mixed\n *\n * @return bool\n */", S(16384),"remove", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.remove.php )\n *\n * Removes the specified key from this StableMap.\n *\n * @key mixed\n *\n * @return object\n */", S(16384),"removeKey", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.removekey.php )\n *\n * Removes the specified key from this StableMap.\n *\n * @key mixed\n *\n * @return object\n */", S(16384),"discard", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.discard.php )\n *\n * Removes the specified key from this StableMap.\n *\n * @key mixed\n *\n * @return object\n */", S(16384),"toArray", T(Array), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.toarray.php )\n *\n * Returns an array built from the keys and values from this StableMap.\n *\n * @return map\n */", S(16384),"copyAsArray", T(Array), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.copyasarray.php )\n *\n * Returns an array built from the keys and values from this StableMap.\n *\n * @return map\n */", S(16384),"toKeysArray", T(Array), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.tokeysarray.php )\n *\n * Returns an array built from the keys from this StableMap.\n *\n * @return map\n */", S(16384),"values", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.values.php )\n *\n * Returns a Vector built from the values from this StableMap.\n *\n * @return object\n */", S(16384),"toValuesArray", T(Array), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.tovaluesarray.php )\n *\n * Returns an array built from the values from this StableMap.\n *\n * @return map\n */", S(16384),"updateFromArray", T(Object), S(0), "arr", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.updatefromarray.php )\n *\n * Inserts the key/value pairs from the specified array into this\n * StableMap.\n *\n * @arr mixed\n *\n * @return object\n */", S(16384),"updateFromIterable", T(Object), S(0), "it", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.updatefromiterable.php\n * )\n *\n * Inserts the keys and values produced by the specified KeyedIterable.\n *\n * @it mixed\n *\n * @return object\n */", S(16384),"differenceByKey", T(Object), S(0), "it", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.differencebykey.php )\n *\n *\n * @it mixed\n *\n * @return object\n */", S(16384),"getIterator", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.getiterator.php )\n *\n * Returns an iterator that points to beginning of this StableMap.\n *\n * @return object\n */", S(16384),"__get", T(Variant), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.get.php )\n *\n *\n * @name mixed\n *\n * @return mixed\n */", S(16384),"__set", T(Variant), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), "value", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.set.php )\n *\n *\n * @name mixed\n * @value mixed\n *\n * @return mixed\n */", S(16384),"__isset", T(Boolean), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.isset.php )\n *\n *\n * @name mixed\n *\n * @return bool\n */", S(16384),"__unset", T(Variant), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.unset.php )\n *\n *\n * @name mixed\n *\n * @return mixed\n */", S(16384),"fromItems", T(Object), S(0), "iterable", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16896), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.fromitems.php )\n *\n * Returns a StableMap built from the key/value Tuples produced by the\n * specified Iterable.\n *\n * @iterable mixed\n *\n * @return object\n */", S(16896),"__toString", T(String), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.tostring.php )\n *\n *\n * @return string\n */", S(16384),"fromArray", T(Object), S(0), "mp", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16896), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.fromarray.php )\n *\n * Returns a StableMap built from the keys and values from the specified\n * array.\n *\n * @mp mixed\n *\n * @return object\n */", S(16896),"fromIterable", T(Object), S(0), "mp", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16896), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.fromiterable.php )\n *\n * Returns a StableMap built from the keys and values produced by the\n * specified KeyedIterable.\n *\n * @mp mixed\n *\n * @return object\n */", S(16896),NULL,NULL,NULL, +S(16416), "/**\n * ( excerpt from http://php.net/manual/en/class.mapiterator.php )\n *\n * An iterator implementation for iterating over a Map.\n *\n */", "StableMap", "", "keyediterable","countable",NULL, "__construct", T(Void), S(0), "iterable", T(Variant), "N;", S(2), "null", S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.construct.php )\n *\n * Returns a StableMap built from the keys and values produced by the\n * specified KeyedIterable.\n *\n * @iterable mixed\n */", S(16384),"isEmpty", T(Boolean), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.isempty.php )\n *\n * Returns true if the StableMap is empty, false otherwise.\n *\n * @return bool\n */", S(16384),"count", T(Int64), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.count.php )\n *\n * Returns the number of key/value pairs in the StableMap.\n *\n * @return int\n */", S(16384),"items", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.items.php )\n *\n * Returns an Iterable that produces the key/value pairs as Tuples from\n * this StableMap.\n *\n * @return object\n */", S(16384),"keys", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.keys.php )\n *\n * Returns an Iterable that produces the keys from this StableMap.\n *\n * @return object\n */", S(16384),"at", T(Variant), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.at.php )\n *\n * Returns the value at the specified key. If the key is not present, an\n * exception is thrown.\n *\n * @key mixed\n *\n * @return mixed\n */", S(16384),"get", T(Variant), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.get.php )\n *\n * Returns the value at the specified key. If the key is not present, null\n * is returned.\n *\n * @key mixed\n *\n * @return mixed\n */", S(16384),"set", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), "value", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.set.php )\n *\n * Stores a value into the StableMap with the specified key, overwriting\n * any previous value that was associated with the key.\n *\n * @key mixed\n * @value mixed\n *\n * @return object\n */", S(16384),"put", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), "value", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.put.php )\n *\n * Stores a value into the StableMap with the specified key, overwriting\n * any previous value that was associated with the key.\n *\n * @key mixed\n * @value mixed\n *\n * @return object\n */", S(16384),"clear", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.clear.php )\n *\n * Removes all key/value pairs from the StableMap.\n *\n * @return object\n */", S(16384),"contains", T(Boolean), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.contains.php )\n *\n * Returns true if the specified key is present in the StableMap, false\n * otherwise.\n *\n * @key mixed\n *\n * @return bool\n */", S(16384),"containsKey", T(Boolean), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.containskey.php )\n *\n * Returns true if the specified key is present in the StableMap, false\n * otherwise.\n *\n * @key mixed\n *\n * @return bool\n */", S(16384),"remove", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.remove.php )\n *\n * Removes the specified key from this StableMap.\n *\n * @key mixed\n *\n * @return object\n */", S(16384),"removeKey", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.removekey.php )\n *\n * Removes the specified key from this StableMap.\n *\n * @key mixed\n *\n * @return object\n */", S(16384),"discard", T(Object), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.discard.php )\n *\n * Removes the specified key from this StableMap.\n *\n * @key mixed\n *\n * @return object\n */", S(16384),"add", T(Object), S(0), "val", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.add.php )\n *\n * Adds the specified key/value Tuple to this StableMap. If an element\n * with the same key is already present, an exception is thrown.\n *\n * @val mixed\n *\n * @return object\n */", S(16384),"toArray", T(Array), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.toarray.php )\n *\n * Returns an array built from the keys and values from this StableMap.\n *\n * @return map\n */", S(16384),"copyAsArray", T(Array), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.copyasarray.php )\n *\n * Returns an array built from the keys and values from this StableMap.\n *\n * @return map\n */", S(16384),"toKeysArray", T(Array), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.tokeysarray.php )\n *\n * Returns an array built from the keys from this StableMap.\n *\n * @return map\n */", S(16384),"values", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.values.php )\n *\n * Returns a Vector built from the values from this StableMap.\n *\n * @return object\n */", S(16384),"toValuesArray", T(Array), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.tovaluesarray.php )\n *\n * Returns an array built from the values from this StableMap.\n *\n * @return map\n */", S(16384),"updateFromArray", T(Object), S(0), "arr", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.updatefromarray.php )\n *\n * Inserts the key/value pairs from the specified array into this\n * StableMap.\n *\n * @arr mixed\n *\n * @return object\n */", S(16384),"updateFromIterable", T(Object), S(0), "it", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.updatefromiterable.php\n * )\n *\n * Inserts the keys and values produced by the specified KeyedIterable.\n *\n * @it mixed\n *\n * @return object\n */", S(16384),"differenceByKey", T(Object), S(0), "it", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.differencebykey.php )\n *\n *\n * @it mixed\n *\n * @return object\n */", S(16384),"getIterator", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.getiterator.php )\n *\n * Returns an iterator that points to beginning of this StableMap.\n *\n * @return object\n */", S(16384),"__get", T(Variant), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.get.php )\n *\n *\n * @name mixed\n *\n * @return mixed\n */", S(16384),"__set", T(Variant), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), "value", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.set.php )\n *\n *\n * @name mixed\n * @value mixed\n *\n * @return mixed\n */", S(16384),"__isset", T(Boolean), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.isset.php )\n *\n *\n * @name mixed\n *\n * @return bool\n */", S(16384),"__unset", T(Variant), S(0), "name", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.unset.php )\n *\n *\n * @name mixed\n *\n * @return mixed\n */", S(16384),"fromItems", T(Object), S(0), "iterable", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16896), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.fromitems.php )\n *\n * Returns a StableMap built from the key/value Tuples produced by the\n * specified Iterable.\n *\n * @iterable mixed\n *\n * @return object\n */", S(16896),"__toString", T(String), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.tostring.php )\n *\n *\n * @return string\n */", S(16384),"fromArray", T(Object), S(0), "mp", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16896), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.fromarray.php )\n *\n * Returns a StableMap built from the keys and values from the specified\n * array.\n *\n * @mp mixed\n *\n * @return object\n */", S(16896),"fromIterable", T(Object), S(0), "mp", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16896), "/**\n * ( excerpt from http://php.net/manual/en/stablemap.fromiterable.php )\n *\n * Returns a StableMap built from the keys and values produced by the\n * specified KeyedIterable.\n *\n * @mp mixed\n *\n * @return object\n */", S(16896),NULL,NULL,NULL, S(16416), "/**\n * ( excerpt from http://php.net/manual/en/class.stablemap.php )\n *\n * An ordered dictionary-style collection.\n *\n */", "StableMapIterator", "", "keyediterator",NULL, "__construct", T(Void), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemapiterator.construct.php\n * )\n *\n *\n */", S(16384),"current", T(Variant), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemapiterator.current.php )\n *\n * Returns the current value that the iterator points to.\n *\n * @return mixed\n */", S(16384),"key", T(Variant), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemapiterator.key.php )\n *\n * Returns the current key that the iterator points to.\n *\n * @return mixed\n */", S(16384),"valid", T(Boolean), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemapiterator.valid.php )\n *\n * Returns true if the iterator points to a valid value, returns false\n * otherwise.\n *\n * @return bool\n */", S(16384),"next", T(Void), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemapiterator.next.php )\n *\n * Advance this iterator forward one position.\n *\n */", S(16384),"rewind", T(Void), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/stablemapiterator.rewind.php )\n *\n * Move this iterator back to the first position.\n *\n */", S(16384),NULL,NULL,NULL, S(16416), "/**\n * ( excerpt from http://php.net/manual/en/class.stablemapiterator.php )\n *\n * An iterator implementation for iterating over a StableMap.\n *\n */", "Tuple", "", "keyediterable","countable",NULL, "__construct", T(Void), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/tuple.construct.php )\n *\n *\n */", S(16384),"isEmpty", T(Boolean), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/tuple.isempty.php )\n *\n * Returns true if this Tuple is empty, false otherwise.\n *\n * @return bool\n */", S(16384),"count", T(Int64), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/tuple.count.php )\n *\n * Returns the number of values in the Tuple.\n *\n * @return int\n */", S(16384),"items", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/tuple.items.php )\n *\n * Returns an Iterable that produces the values from this Tuple.\n *\n * @return object\n */", S(16384),"keys", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/tuple.keys.php )\n *\n * Returns an Iterable that produces the keys from this Tuple.\n *\n * @return object\n */", S(16384),"toArray", T(Array), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/tuple.toarray.php )\n *\n * Returns an array built from the values from this Tuple.\n *\n * @return map\n */", S(16384),"getIterator", T(Object), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/tuple.getiterator.php )\n *\n * Returns an iterator that points to beginning of this Tuple.\n *\n * @return object\n */", S(16384),"at", T(Variant), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/tuple.at.php )\n *\n * Returns the value at the specified key. If the key is not present, an\n * exception is thrown.\n *\n * @key mixed\n *\n * @return mixed\n */", S(16384),"get", T(Variant), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/tuple.get.php )\n *\n * Returns the value at the specified key. If the key is not present, null\n * is returned.\n *\n * @key mixed\n *\n * @return mixed\n */", S(16384),"containsKey", T(Boolean), S(0), "key", T(Variant), NULL, S(0), NULL, S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/tuple.containskey.php )\n *\n * Returns true if the specified key is present in the Tuple, returns\n * false otherwise.\n *\n * @key mixed\n *\n * @return bool\n */", S(16384),NULL,NULL,NULL, S(16416), "/**\n * ( excerpt from http://php.net/manual/en/class.tuple.php )\n *\n * An ordered fixed-sized container.\n *\n */", "TupleIterator", "", "keyediterator",NULL, "__construct", T(Void), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/tupleiterator.construct.php )\n *\n *\n */", S(16384),"current", T(Variant), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/tupleiterator.current.php )\n *\n * Returns the current value that the iterator points to.\n *\n * @return mixed\n */", S(16384),"key", T(Variant), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/tupleiterator.key.php )\n *\n * Returns the current key that the iterator points to.\n *\n * @return mixed\n */", S(16384),"valid", T(Boolean), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/tupleiterator.valid.php )\n *\n * Returns true if the iterator points to a valid value, returns false\n * otherwise.\n *\n * @return bool\n */", S(16384),"next", T(Void), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/tupleiterator.next.php )\n *\n * Advance this iterator forward one position.\n *\n */", S(16384),"rewind", T(Void), S(0), NULL, S(16384), "/**\n * ( excerpt from http://php.net/manual/en/tupleiterator.rewind.php )\n *\n * Move this iterator back to the first position.\n *\n */", S(16384),NULL,NULL,NULL, diff --git a/hphp/test/test_code_run.cpp b/hphp/test/test_code_run.cpp index bf46d1bfc..9978b654f 100644 --- a/hphp/test/test_code_run.cpp +++ b/hphp/test/test_code_run.cpp @@ -10084,6 +10084,42 @@ bool TestCodeRun::TestCollectionClasses() { "bool(false)\n" ); + MVCRO(" 1, 2 => 'b', 'c' => array()};\n" + " $mp2 = StableMap {};\n" + " $mp3 = StableMap {};\n" + " foreach ($mp1->items() as $t) {\n" + " $mp2->add($t);\n" + " }\n" + " var_dump($mp2);\n" + " foreach ($mp1->items() as $t) {\n" + " $mp3[] = $t;\n" + " }\n" + " var_dump($mp3);\n" + "}\n" + "f();\n" + , + "object(StableMap)#2 (3) {\n" + " [\"a\"]=>\n" + " int(1)\n" + " [2]=>\n" + " string(1) \"b\"\n" + " [\"c\"]=>\n" + " array(0) {\n" + " }\n" + "}\n" + "object(StableMap)#3 (3) {\n" + " [\"a\"]=>\n" + " int(1)\n" + " [2]=>\n" + " string(1) \"b\"\n" + " [\"c\"]=>\n" + " array(0) {\n" + " }\n" + "}\n" + ); + return true; }