bool SharedMap::IsVectorData(const ArrayData* ad) { auto a = asSharedMap(ad); const auto n = a->size(); for (ssize_t i = 0; i < n; i++) { if (a->getIndex(i) != i) return false; } return true; }
void SharedMap::NvGetKey(const ArrayData* ad, TypedValue* out, ssize_t pos) { auto a = asSharedMap(ad); Variant k = a->m_arr->getKey(pos); TypedValue* tv = k.asTypedValue(); // copy w/out clobbering out->_count. out->m_type = tv->m_type; out->m_data.num = tv->m_data.num; if (tv->m_type != KindOfInt64) out->m_data.pstr->incRefCount(); }
HOT_FUNC void SharedMap::Release(ArrayData* ad) { auto const smap = asSharedMap(ad); smap->~SharedMap(); MM().smartFreeSize(smap, sizeof(SharedMap)); }
SharedVariant* SharedMap::GetSharedVariant(const ArrayData* ad) { auto a = asSharedMap(ad); if (a->m_arr->shouldCache()) return nullptr; return a->m_arr; }
CVarRef SharedMap::GetValueRef(const ArrayData* ad, ssize_t pos) { return asSharedMap(ad)->getValueRef(pos); }
ssize_t SharedMap::IterRewind(const ArrayData* ad, ssize_t prev) { assert(prev >= 0 && prev < asSharedMap(ad)->m_size); ssize_t next = prev - 1; return next >= 0 ? next : invalid_index; }
ssize_t SharedMap::IterAdvance(const ArrayData* ad, ssize_t prev) { auto a = asSharedMap(ad); assert(prev >= 0 && prev < a->m_size); ssize_t next = prev + 1; return next < a->m_size ? next : invalid_index; }
ArrayData *SharedMap::Append(ArrayData* ad, CVarRef v, bool copy) { auto a = asSharedMap(ad); ArrayData *escalated = a->SharedMap::escalate(); return releaseIfCopied(escalated, escalated->append(v, false)); }
ssize_t SharedMap::IterBegin(const ArrayData* ad) { auto a = asSharedMap(ad); return a->m_size > 0 ? 0 : invalid_index; }
ArrayData* SharedMap::EscalateForSort(ArrayData* ad) { auto a = asSharedMap(ad); auto ret = a->m_arr->loadElems(*a); assert(!ret->isStatic()); return ret; }
TypedValue* SharedMap::NvGetStr(const ArrayData* ad, const StringData* key) { auto a = asSharedMap(ad); auto index = a->getIndex(key); if (index == -1) return nullptr; return (TypedValue*)&a->getValueRef(index); }
TypedValue* SharedMap::NvGetInt(const ArrayData* ad, int64_t k) { auto a = asSharedMap(ad); auto index = a->getIndex(k); if (index == -1) return nullptr; return (TypedValue*)&a->getValueRef(index); }
ArrayData *SharedMap::Escalate(const ArrayData* ad) { auto smap = asSharedMap(ad); auto ret = smap->m_arr->loadElems(*smap); assert(!ret->isStatic()); return ret; }
HOT_FUNC void SharedMap::Release(ArrayData* ad) { asSharedMap(ad)->release(); }
bool SharedMap::ExistsStr(const ArrayData* ad, const StringData* k) { auto a = asSharedMap(ad); return a->getIndex(k) != -1; }
ssize_t SharedMap::IterEnd(const ArrayData* ad) { auto a = asSharedMap(ad); auto n = a->m_size; return n > 0 ? ssize_t(n - 1) : invalid_index; }
bool SharedMap::ExistsInt(const ArrayData* ad, int64_t k) { return asSharedMap(ad)->getIndex(k) != -1; }
ArrayData* SharedMap::SetStr(ArrayData* ad, StringData* k, CVarRef v, bool copy) { ArrayData *escalated = asSharedMap(ad)->SharedMap::escalate(); return releaseIfCopied(escalated, escalated->set(k, v, false)); }