class DenseLocalDateDoubleTimeSeries implements ImmutableBean, LocalDateDoubleTimeSeries, Serializable {

  @Override
  public LocalDateDoubleTimeSeries subSeries(LocalDate startInclusive, LocalDate endExclusive) {
    ArgChecker.notNull(startInclusive, "startInclusive");
    ArgChecker.notNull(endExclusive, "endExclusive");
    if (endExclusive.isBefore(startInclusive)) {
      throw new IllegalArgumentException(
          "Invalid sub series, end before start: " + startInclusive + " to " + endExclusive);
    }

    // special case when this is empty or when the dates are the same
    // or the series don't intersect
    if (isEmpty() ||
        startInclusive.equals(endExclusive) ||
        !startDate.isBefore(endExclusive) ||
        startInclusive.isAfter(getLatestDate())) {
      return LocalDateDoubleTimeSeries.empty();
    }

    LocalDate resolvedStart = dateCalculation.adjustDate(Ordering.natural().max(startInclusive, startDate));
    int startIndex = dateCalculation.calculatePosition(startDate, resolvedStart);
    int endIndex = dateCalculation.calculatePosition(startDate, endExclusive);
    return new DenseLocalDateDoubleTimeSeries(
        resolvedStart,
        Arrays.copyOfRange(points, Math.max(0, startIndex), Math.min(points.length, endIndex)),
        dateCalculation,
        true,
        0);
  }

  private  DenseLocalDateDoubleTimeSeries(
      LocalDate startDate,
      double[] points,
      DenseTimeSeriesCalculation dateCalculation,
      boolean trusted,
      int size);
  @ImmutableConstructor private  DenseLocalDateDoubleTimeSeries(
      LocalDate startDate,
      double[] points,
      DenseTimeSeriesCalculation dateCalculation);

}