/* (non-Javadoc)
  * @see iitb.Model.FeatureTypes#startScanFeaturesAt(iitb.CRF.DataSequence, int)
  * all windows that overlap with this position
  *
  */
 private void assignBoundaryInt(BFeatureImpl feature, int pos) {
   Window w = windows[currentWindow];
   if (w.startRelativeToLeft && w.endRelativeToLeft) {
     // TODO -- handle this case. for each value between w.start..w.end generate a different
     // feature
     assert (pos - w.start == pos - w.end);
     feature._startB = pos - w.start;
     feature._endB = feature._startB + w.minLength - 1;
     feature._startOpen = false;
     feature._endOpen = (w.maxLength == Integer.MAX_VALUE);
   } else if (w.startRelativeToLeft && !w.endRelativeToLeft) {
     feature._startB = pos - w.start;
     feature._endB = pos - w.end;
     feature._startOpen = (w.maxLength == Integer.MAX_VALUE);
     feature._endOpen = (w.maxLength == Integer.MAX_VALUE);
   } else if (!w.startRelativeToLeft && !w.endRelativeToLeft) {
     assert (pos - w.start == pos - w.end);
     feature._endB = pos - w.end;
     feature._startB = feature._endB - w.minLength + 1;
     feature._startOpen = (w.maxLength == Integer.MAX_VALUE);
     feature._endOpen = false;
   } else assert (false); // invalid combination
 }
 private boolean nextFeatureNew() {
   Window twindow = windows[currWin];
   currBdry++;
   if (currBdry <= cfRange.end) {
     switch (getWindowType(twindow)) {
       case WIN_LEFT:
         fboundary._startB = currBdry;
         fboundary._endB = fboundary._startB + minWinLength - 1;
         break;
       case WIN_RIGHT:
         fboundary._endB = currBdry;
         fboundary._startB = fboundary._endB - minWinLength + 1;
         break;
       case WIN_MIDDLE:
         fboundary._startB = currBdry;
         fboundary._endB = fboundary._startB + maxGap - 1;
         break;
     }
     return true;
   } else {
     featureValid = false;
     return false;
   }
 }