private static int binarySearchForX(XYDataset data, int series, double x) {
   // inclusive lo bound, exclusive hi bound
   int lo = 0, hi = data.getItemCount(series);
   while (lo < hi) {
     int mid = (lo + hi) / 2;
     double midX = data.getXValue(series, mid);
     if (x < midX) hi = mid;
     else if (x > midX) lo = mid + 1;
     else return mid;
   }
   return lo; // not found, return index of next date
 }
  public XYDatasetSubdomainAdapter(XYDataset dataset, double loX, double hiX) {
    super(dataset);
    this.dataset = dataset;
    int seriesCount = dataset.getSeriesCount();
    this.itemOffsets = new int[seriesCount];
    this.itemCounts = new int[seriesCount];
    for (int series = 0; series < seriesCount; series++) {
      int loItem = binarySearchForX(dataset, series, loX);
      int hiItem = binarySearchForX(dataset, series, hiX);
      if (hiItem < dataset.getItemCount(series) && hiX == dataset.getXValue(series, hiItem))
        hiItem++; // exclusive, so count will be accurate

      this.itemOffsets[series] = loItem;
      this.itemCounts[series] = hiItem - loItem;
    }
  }