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());
}
示例#3
0
 typename _MapT<MAP>::KeyIter
 eachDistinctKey (MAP& map)
 {
   typedef RangeIter<typename MAP::iterator> Range;
   
   Range contents (map.begin(), map.end());
   return wrapIter (filterRepetitions (takePairFirst(contents)));
 }
示例#4
0
 typename _MapT<MAP>::ValIter
 eachMapVal (MAP& map)
 {
   typedef RangeIter<typename MAP::iterator> Range;
   
   Range contents (map.begin(), map.end());
   return wrapIter (takePairSecond(contents));
 }
示例#5
0
 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;
}
示例#10
0
 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));
 }