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; }
ssize_t Globals::iter_begin() const { if (empty()) return ArrayData::invalid_index; if (staticSize() > 0) { return 0; } return wrapIter(Array::get()->iter_begin()); }
typename _MapT<MAP>::KeyIter eachDistinctKey (MAP& map) { typedef RangeIter<typename MAP::iterator> Range; Range contents (map.begin(), map.end()); return wrapIter (filterRepetitions (takePairFirst(contents))); }
typename _MapT<MAP>::ValIter eachMapVal (MAP& map) { typedef RangeIter<typename MAP::iterator> Range; Range contents (map.begin(), map.end()); return wrapIter (takePairSecond(contents)); }
typename _MapT<MAP>::KeyIter eachMapKey (MAP& map) { typedef RangeIter<typename MAP::iterator> Range; Range contents (map.begin(), map.end()); return wrapIter (takePairFirst (contents)); }
bool Globals::isHead(ssize_t pos) const { if (staticSize() > 0) return pos == 0; if (pos < -1) { ArrayData *arr = Array::get(); ASSERT(arr); return !arr->empty() && wrapIter(pos) == arr->iter_begin(); } return false; }
ssize_t Globals::iter_rewind(ssize_t prev) const { if (prev < -1) { ArrayData *arr = Array::get(); ASSERT(arr); ssize_t next = arr->iter_rewind(wrapIter(prev)); if (next == ArrayData::invalid_index) { if (staticSize() > 0) { return staticSize() - 1; } return ArrayData::invalid_index; } else { return wrapIter(next); } } ssize_t next = prev - 1; if (next < 0) return ArrayData::invalid_index; return next; }
CVarRef Globals::getRefByIdx(ssize_t pos, Variant& k) { if (pos < -1) { ArrayData *arr = Array::get(); pos = wrapIter(pos); k = arr->getKey(pos); return arr->getValueRef(pos); } ASSERT(false); throw FatalErrorException("bad code generation"); }
bool Globals::isTail(ssize_t pos) const { ArrayData *arr = Array::get(); if (!arr || arr->empty()) { return staticSize() > 0 && pos == staticSize() - 1; } if (pos < -1) { return wrapIter(pos) == arr->iter_end(); } return false; }
typename _MapT<MAP>::ValIter eachValForKey (MAP& map, typename _MapT<MAP>::Key key) { typedef typename MAP::iterator Pos; typedef RangeIter<Pos> Range; std::pair<Pos,Pos> valuesForKey = map.equal_range(key); Range contents (valuesForKey.first, valuesForKey.second); return wrapIter (takePairSecond(contents)); }