public Vector put(Range holder, Object value) {
    int pos = VectorUtil.binarySearch(ranges, holder, rangeComparator, true);
    if (pos == -1) {
      pos = 0;
    }
    Vector output = new Vector();

    int posHigh =
        VectorUtil.binarySearch(
            ranges, new RangeHolder(holder.getHigh(), holder.getHigh()), rangeComparator, true);

    Vector purged = new Vector();
    boolean positionRemoved = false;
    for (int i = (pos - 1 >= 0 ? pos - 1 : 0); i < posHigh && i < ranges.size(); i++) {
      Range clobberMe = (Range) ranges.elementAt(i);
      if (overlaps(clobberMe, holder)) {
        if (i == pos - 1) positionRemoved = true;
        output.addElement(data.remove(clobberMe));
        purged.addElement(clobberMe);
      }
    }
    for (int i = 0; i < purged.size(); i++) ranges.removeElement(purged.elementAt(i));

    if (positionRemoved) pos = pos - 1;

    ranges.insertElementAt(holder, pos);
    data.put(holder, value);
    return output;
  }
    public VsmCacheModel invoke() {
      if (cfIndex != null) {
        documents = (Map<String, List<LinkedHashMap<String, Object>>>) cfIndex;
      } else {
        documents = VectorUtil.getFeaturesForAllClasses(db);
        vectorSpaceModelCache.put("CLASS_FEATURE_INDEX", documents);
      }

      if (vsmIndex != null) {
        featureIndexList = (List<Integer>) vsmIndex;
      } else {
        featureIndexList = VectorUtil.getFeatureIndexList(db);
        vectorSpaceModelCache.put("GLOBAL_FEATURE_INDEX", featureIndexList);
      }
      return this;
    }
 /**
  * Removes the EXACT range defined by (low,high). If no range is defined on exactly those
  * coordinates, no elements are removed
  */
 public Object remove(int low, int high) {
   RangeHolder holder = new RangeHolder(low, high);
   int pos = VectorUtil.binarySearch(ranges, holder, rangeComparator, false);
   Range found = (Range) ranges.elementAt(pos);
   if (found.equals(holder)) return data.remove(holder);
   else return null;
 }
 /**
  * Removes and returns the value whose key range contains the given key. If there is no such
  * value, null is returned.
  */
 public Object remove(int key) {
   RangeHolder holder = new RangeHolder(key, key + 1);
   int pos = VectorUtil.binarySearch(ranges, holder, rangeComparator, true) - 1;
   if (pos < 0) return null;
   Range rh = (Range) ranges.elementAt(pos);
   return data.remove(rh);
 }
  public double[] getInterval(int key) {
    double[] output = new double[2];
    RangeHolder holder = new RangeHolder(key, key + 1);
    int pos = VectorUtil.binarySearch(ranges, holder, rangeComparator, true) - 1;
    // System.err.println("ranges = "+ranges);
    if (ranges.size() == 0) {
      output[0] = Double.NEGATIVE_INFINITY;
      output[1] = Double.POSITIVE_INFINITY;
      return output;
    }

    if (pos < 0) {
      output[0] = Double.NEGATIVE_INFINITY;
      output[1] = (double) ((Range) ranges.elementAt(0)).getLow() - 1;
      return output;
    }

    if (pos >= ranges.size()) {
      output[0] = (double) ((Range) ranges.elementAt(ranges.size() - 1)).getHigh() + 1;
      output[1] = Double.POSITIVE_INFINITY;
      return output;
    }

    Range rh = (Range) ranges.elementAt(pos);
    if (contains(rh, key)) {
      output[0] = (double) rh.getLow();
      output[1] = (double) rh.getHigh();
    } else {
      output[0] = (double) rh.getHigh() + 1;
      if (pos < ranges.size() - 1) output[1] = ((Range) ranges.elementAt(pos + 1)).getLow() - 1;
      else output[1] = Double.POSITIVE_INFINITY;
    }

    return output;
  }
 /**
  * Returns the value whose key range contains the given key, or null if no range contains that
  * key.
  */
 public Object get(int key) {
   RangeHolder holder = new RangeHolder(key, key + 1);
   int pos = VectorUtil.binarySearch(ranges, holder, rangeComparator, true) - 1;
   if (pos < 0) return null;
   Range rh = (Range) ranges.elementAt(pos);
   if (contains(rh, key)) return data.get(rh);
   else return null;
 }
  public Vector get(int low, int high) {
    Vector output = new Vector();
    RangeHolder holder = new RangeHolder(low, high);

    int lowPos = VectorUtil.binarySearch(ranges, new RangeHolder(low, low), rangeComparator, true);
    if (lowPos == -1) lowPos = 0;

    int highPos =
        VectorUtil.binarySearch(ranges, new RangeHolder(high, high), rangeComparator, true);

    for (int i = (lowPos - 1 >= 0 ? lowPos - 1 : 0); i < highPos && i < ranges.size(); i++) {
      Range getMe = (Range) ranges.elementAt(i);
      if (overlaps(getMe, holder)) {
        output.addElement(data.get(getMe));
      }
    }

    return output;
  }
 public int[] getDefinedInterval(int key) {
   RangeHolder holder = new RangeHolder(key, key);
   int pos = VectorUtil.binarySearch(ranges, holder, rangeComparator, true) - 1;
   if (pos < 0 || pos >= ranges.size()) return null;
   Range r = (Range) ranges.elementAt(pos);
   if (r.getLow() <= key && r.getHigh() >= key) {
     int[] out = new int[2];
     out[0] = r.getLow();
     out[1] = r.getHigh();
     return out;
   } else return null;
 }
 // TODO: wtf?
 public int getIntervalIndex(int low, int high, boolean exact) {
   int lowPos =
       VectorUtil.binarySearch(ranges, new RangeHolder(low, high), rangeComparator, !exact);
   return lowPos;
 }