ssize_t Globals::iter_advance(ssize_t prev) const { ArrayData *arr = Array::get(); if (prev < -1) { return wrapIter(arr->iter_advance(wrapIter(prev))); } ssize_t next = prev + 1; if (next == staticSize()) { if (arr) return wrapIter(arr->iter_begin()); return ArrayData::invalid_index; } return next; }
ALWAYS_INLINE typename std::enable_if< std::is_base_of<BaseMap, TMap>::value, Object>::type BaseMap::FromArray(const Class*, const Variant& arr) { if (!arr.isArray()) { SystemLib::throwInvalidArgumentExceptionObject( "Parameter arr must be an array"); } auto map = req::make<TMap>(); ArrayData* ad = arr.getArrayData(); map->reserve(ad->size()); for (ssize_t pos = ad->iter_begin(), limit = ad->iter_end(); pos != limit; pos = ad->iter_advance(pos)) { Variant k = ad->getKey(pos); auto* tv = ad->getValueRef(pos).asCell(); if (k.isInteger()) { map->setRaw(k.toInt64(), tv); } else { assert(k.isString()); map->setRaw(k.getStringData(), tv); } } return Object(std::move(map)); }