ArrayData *ZendArray::remove(CVarRef k, bool copy) { TypedValueAccessor tva = k.getTypedAccessor(); if (isIntKey(tva)) { if (UNLIKELY(copy)) { ZendArray *a = copyImpl(); a->prepareBucketHeadsForWrite(); a->erase(a->findForErase(getIntKey(tva))); return a; } prepareBucketHeadsForWrite(); erase(findForErase(getIntKey(tva))); return NULL; } else { ASSERT(k.isString()); StringData *key = getStringKey(tva); int64 prehash = key->hash(); if (UNLIKELY(copy)) { ZendArray *a = copyImpl(); a->prepareBucketHeadsForWrite(); a->erase(a->findForErase(key->data(), key->size(), prehash)); return a; } prepareBucketHeadsForWrite(); erase(findForErase(key->data(), key->size(), prehash)); return NULL; } }
bool ZendArray::exists(CVarRef k) const { TypedValueAccessor tva = k.getTypedAccessor(); if (isIntKey(tva)) return find(getIntKey(tva)); ASSERT(k.isString()); StringData *key = getStringKey(tva); return find(key->data(), key->size(), key->hash()); }
ArrayData *ZendArray::append(const ArrayData *elems, ArrayOp op, bool copy) { if (UNLIKELY(copy)) { ZendArray *a = copyImpl(); a->append(elems, op, false); return a; } if (op == Plus) { for (ArrayIter it(elems); !it.end(); it.next()) { Variant key = it.first(); CVarRef value = it.secondRef(); if (key.isNumeric()) { addValWithRef(key.toInt64(), value); } else { addValWithRef(key.getStringData(), value); } } } else { ASSERT(op == Merge); for (ArrayIter it(elems); !it.end(); it.next()) { Variant key = it.first(); CVarRef value = it.secondRef(); if (key.isNumeric()) { nextInsertWithRef(value); } else { Variant *p; StringData *sd = key.getStringData(); addLvalImpl(sd, sd->hash(), &p, true); p->setWithRef(value); } } } return NULL; }
HOT_FUNC void ImmutableMap::add(int pos, CVarRef key, CVarRef val, bool unserializeObj) { int64_t ikey; StringData* skey; int32_t hash; Bucket* b = buckets() + pos; switch (key.getType()) { case KindOfInt64: { hash = ikey = key.toInt64(); b->setIntKey(ikey); break; } case KindOfString: { skey = StringData::GetStaticString(key.getStringData()); goto static_case; } case KindOfStaticString: { skey = key.getStringData(); static_case: hash = skey->hash(); b->setStrKey(skey, hash); break; } default: not_reached(); } addVal(pos, hash & m.m_capacity_mask, val, unserializeObj); }
CVarRef ZendArray::get(CStrRef k, bool error /* = false */) const { StringData *key = k.get(); int64 prehash = key->hash(); Bucket *p = find(key->data(), key->size(), prehash); if (p) { return p->data; } if (error) { raise_notice("Undefined index: %s", k.data()); } return null_variant; }
ArrayData *VectorArray::lval(CVarRef k, Variant *&ret, bool copy, bool checkExist /* = false */) { Variant::TypedValueAccessor tva = k.getTypedAccessor(); if (isIntKey(tva)) { return VectorArray::lval(getIntKey(tva), ret, copy, checkExist); } ASSERT(k.isString()); ZendArray *a = escalateToZendArray(); StringData *sd = getStringKey(tva); a->addLvalImpl(sd, sd->hash(), &ret); return a; }
ssize_t ZendArray::getIndex(CVarRef k) const { Bucket *p; TypedValueAccessor tva = k.getTypedAccessor(); if (isIntKey(tva)) { p = find(getIntKey(tva)); } else { ASSERT(k.isString()); StringData *key = getStringKey(tva); p = find(key->data(), key->size(), key->hash()); } if (p) { return (ssize_t)p; } return ArrayData::invalid_index; }
void ZendArray::load(CVarRef k, Variant &v) const { Bucket *p; TypedValueAccessor tva = k.getTypedAccessor(); if (isIntKey(tva)) { p = find(getIntKey(tva)); } else { ASSERT(k.isString()); StringData *strkey = getStringKey(tva); int64 prehash = strkey->hash(); p = find(strkey->data(), strkey->size(), prehash); } if (p) { v.setWithRef(p->data); } }
CVarRef ZendArray::get(CVarRef k, bool error /* = false */) const { Bucket *p; TypedValueAccessor tva = k.getTypedAccessor(); if (isIntKey(tva)) { p = find(getIntKey(tva)); } else { ASSERT(k.isString()); StringData *strkey = getStringKey(tva); int64 prehash = strkey->hash(); p = find(strkey->data(), strkey->size(), prehash); } if (p) { return p->data; } if (error) { raise_notice("Undefined index: %s", k.toString().data()); } return null_variant; }
ArrayData *ZendArray::lvalPtr(CStrRef k, Variant *&ret, bool copy, bool create) { StringData *key = k.get(); int64 prehash = key->hash(); ZendArray *a = 0, *t = this; if (UNLIKELY(copy)) { a = t = copyImpl(); } if (create) { t->addLvalImpl(key, prehash, &ret); } else { Bucket *p = t->find(key->data(), key->size(), prehash); if (p) { ret = &p->data; } else { ret = NULL; } } return a; }
ArrayData *ZendArray::lval(CStrRef k, Variant *&ret, bool copy, bool checkExist /* = false */) { StringData *key = k.get(); int64 prehash = key->hash(); if (!copy) { addLvalImpl(key, prehash, &ret); return NULL; } if (!checkExist) { ZendArray *a = copyImpl(); a->addLvalImpl(key, prehash, &ret); return a; } Bucket *p = find(key->data(), key->size(), prehash); if (p && (p->data.isReferenced() || p->data.isObject())) { ret = &p->data; return NULL; } ZendArray *a = copyImpl(); a->addLvalImpl(key, prehash, &ret, p); return a; }