diff --git a/src/main/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnOrRowRangeReference.java b/src/main/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnOrRowRangeReference.java index e7158bb20..ce54072c3 100644 --- a/src/main/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnOrRowRangeReference.java +++ b/src/main/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnOrRowRangeReference.java @@ -17,174 +17,16 @@ package walkingkooka.spreadsheet.reference; -import walkingkooka.Cast; -import walkingkooka.collect.HasRange; -import walkingkooka.collect.HasRangeBounds; -import walkingkooka.collect.Range; -import walkingkooka.spreadsheet.formula.parser.SpreadsheetFormulaParserToken; - -import java.util.Iterator; -import java.util.Optional; -import java.util.function.Function; -import java.util.stream.IntStream; - /** * Base class for a range that holds a column or row range. */ @SuppressWarnings("lgtm[java/inconsistent-equals-and-hashcode]") -abstract class SpreadsheetColumnOrRowRangeReference> extends SpreadsheetSelection - implements HasRange, - HasRangeBounds, - Iterable { +abstract class SpreadsheetColumnOrRowRangeReference extends SpreadsheetSelection { /** * Package private ctor */ - SpreadsheetColumnOrRowRangeReference(final Range range) { + SpreadsheetColumnOrRowRangeReference() { super(); - this.range = range; - } - - /** - * Returns the top left column/row reference. - */ - @SuppressWarnings("OptionalGetWithoutIsPresent") - @Override - public final T begin() { - return this.range.lowerBound().value().get(); // must exist - } - - /** - * Returns the bottom right column/row reference. - */ - @SuppressWarnings("OptionalGetWithoutIsPresent") - @Override - public final T end() { - return this.range.upperBound().value().get(); // must exist - } - - // replaceReferencesMapper.......................................................................................... - - @Override - final Optional>> replaceReferencesMapper0(final SpreadsheetSelection movedTo) { - return this.toScalar() - .replaceReferencesMapper0(movedTo); - } - - // count............................................................................................................ - - /** - * Returns the number of columns or rows in this range. - */ - @Override - public final long count() { - return this.end() - .value() - - this.begin() - .value() - + 1; - } - - @Override - public final boolean isFirst() { - return this.begin().isFirst() && this.isUnit(); - } - - @Override - public final boolean isLast() { - return this.begin().isLast() && this.isUnit(); - } - - /** - * Returns a {@link SpreadsheetCellReference} that holds the top left column/row reference. - */ - @Override - public final Range range() { - return this.range; - } - - final Range range; - - /** - * Would be setter that accepts a pair of column/row, and returns a range with those values, - * creating a new instance if necessary. - */ - final > R setRange0(final Range range) { - return Cast.to( - this.range.equals(range) ? - this : - this.replace(range) - ); - } - - abstract SpreadsheetColumnOrRowRangeReference replace(final Range range); - - // toXXX............................................................................................................ - - @Override - public SpreadsheetSelection toScalar() { - return this.begin(); - } - - @Override - public final SpreadsheetCellReference toCell() { - return this.toScalar() - .toCell(); - } - - // Iterable......................................................................................................... - - @Override - public final Iterator iterator() { - return IntStream.rangeClosed( - this.begin().value(), - this.end().value() - ) - .boxed() - .map(this::iteratorIntToReference) - .iterator(); - } - - /** - * Mapping expression that returns a relative {@link SpreadsheetColumnOrRowReference} given the value. - */ - abstract T iteratorIntToReference(int value); - - // HasParserToken................................................................................................... - - @Override - public final SpreadsheetFormulaParserToken toParserToken() { - throw new UnsupportedOperationException(); - } - - // HashCodeEqualsDefined....................................................................................... - - @Override - public final int hashCode() { - return this.range.hashCode(); - } - - @Override - boolean equalsNotSameAndNotNull(final Object other, - final boolean includeKind) { - return this.equals1( - (SpreadsheetColumnOrRowRangeReference) other, - includeKind - ); - } - - private boolean equals1(final SpreadsheetColumnOrRowRangeReference other, - final boolean includeKind) { - return this.begin().equalsNotSameAndNotNull(other.begin(), includeKind) && - this.end().equalsNotSameAndNotNull(other.end(), includeKind); - } - - // toString........................................................................................................ - - @Override - public final String toString() { - return this.isUnit() ? - this.begin().toString() : - this.begin() + SEPARATOR.string() + this.end(); } } diff --git a/src/main/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnOrRowReferenceKind.java b/src/main/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnOrRowReferenceKind.java index 62c460d27..1ff0c04d7 100644 --- a/src/main/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnOrRowReferenceKind.java +++ b/src/main/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnOrRowReferenceKind.java @@ -186,7 +186,7 @@ public static SpreadsheetColumnOrRowReference parseColumnOrRow(final String text /** * Extracts either the column or row range reference from the given {@link SpreadsheetSelection}. */ - public abstract SpreadsheetColumnOrRowRangeReference columnOrRowRange(final SpreadsheetSelection selection); + public abstract SpreadsheetColumnOrRowRangeReference columnOrRowRange(final SpreadsheetSelection selection); /** * Returns the width or height for the given {@link SpreadsheetSelection}. For {@link #COLUMN} it will return the width. diff --git a/src/main/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnRangeReference.java b/src/main/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnRangeReference.java index 07d71cdf1..64903000c 100644 --- a/src/main/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnRangeReference.java +++ b/src/main/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnRangeReference.java @@ -17,23 +17,31 @@ package walkingkooka.spreadsheet.reference; +import walkingkooka.collect.HasRange; +import walkingkooka.collect.HasRangeBounds; import walkingkooka.collect.Range; import walkingkooka.collect.RangeBound; +import walkingkooka.spreadsheet.formula.parser.SpreadsheetFormulaParserToken; import walkingkooka.text.CharSequences; import java.util.EnumSet; +import java.util.Iterator; import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.function.Predicate; +import java.util.stream.IntStream; /** * Holds a column range. */ @SuppressWarnings("lgtm[java/inconsistent-equals-and-hashcode]") -public final class SpreadsheetColumnRangeReference extends SpreadsheetColumnOrRowRangeReference - implements Comparable { +public final class SpreadsheetColumnRangeReference extends SpreadsheetColumnOrRowRangeReference + implements Comparable, + HasRange, + HasRangeBounds, + Iterable { /** * A {@link SpreadsheetColumnRangeReference} that includes all columns. @@ -56,16 +64,46 @@ static SpreadsheetColumnRangeReference with(final Range range) { - super(range); + super(); + this.range = range; } - public SpreadsheetColumnRangeReference setRange(final Range range) { - return this.setRange0(range); + /** + * Returns the top left column/row reference. + */ + @SuppressWarnings("OptionalGetWithoutIsPresent") + @Override + public SpreadsheetColumnReference begin() { + return this.range.lowerBound() + .value() + .get(); // must exist } + /** + * Returns the bottom right column/row reference. + */ + @SuppressWarnings("OptionalGetWithoutIsPresent") @Override - SpreadsheetColumnRangeReference replace(final Range range) { - return with(range); + public SpreadsheetColumnReference end() { + return this.range.upperBound() + .value() + .get(); // must exist + } + + @Override + public Range range() { + return this.range; + } + + private final Range range; + + + public SpreadsheetColumnRangeReference setRange(final Range range) { + Objects.requireNonNull(range, "range"); + + return this.range.equals(range) ? + this : + with(range); } /** @@ -176,6 +214,40 @@ boolean testRowNonNull(final SpreadsheetRowReference row) { return false; } + // count............................................................................................................ + + /** + * Returns the number of columns in this range. + */ + @Override + public long count() { + return this.end() + .value() + - this.begin() + .value() + + 1; + } + + // isXXX............................................................................................................ + + @Override + public boolean isFirst() { + return this.begin().isFirst() && this.isUnit(); + } + + @Override + public boolean isLast() { + return this.begin().isLast() && this.isUnit(); + } + + // toXXX............................................................................................................ + + @Override + public SpreadsheetCellReference toCell() { + return this.toScalar() + .toCell(); + } + @Override public SpreadsheetColumnReference toColumn() { return this.begin(); @@ -196,6 +268,13 @@ public SpreadsheetRowRangeReference toRowRange() { throw new UnsupportedOperationException(this.toString()); } + // toScalar......................................................................................................... + + @Override + public SpreadsheetColumnReference toScalar() { + return this.begin(); + } + // toRange.......................................................................................................... @Override @@ -441,6 +520,14 @@ public SpreadsheetColumnReference focused(final SpreadsheetViewportAnchor anchor .column(this); } + // replaceReferencesMapper.......................................................................................... + + @Override + Optional>> replaceReferencesMapper0(final SpreadsheetSelection movedTo) { + return this.toScalar() + .replaceReferencesMapper0(movedTo); + } + // SpreadsheetSelectionVisitor...................................................................................... @Override @@ -451,11 +538,53 @@ void accept(final SpreadsheetSelectionVisitor visitor) { // Iterable......................................................................................................... @Override - SpreadsheetColumnReference iteratorIntToReference(final int value) { - return SpreadsheetReferenceKind.RELATIVE.column(value); + public Iterator iterator() { + return IntStream.rangeClosed( + this.begin().value(), + this.end().value() + ) + .boxed() + .map(SpreadsheetReferenceKind.RELATIVE::column) + .iterator(); } - // Object........................................................................................................... + // HasParserToken................................................................................................... + + @Override + public SpreadsheetFormulaParserToken toParserToken() { + throw new UnsupportedOperationException(); + } + + // hashCode/equals.................................................................................................. + + @Override + public int hashCode() { + return this.range.hashCode(); + } + + @Override + boolean equalsNotSameAndNotNull(final Object other, + final boolean includeKind) { + return this.equals1( + (SpreadsheetColumnRangeReference) other, + includeKind + ); + } + + private boolean equals1(final SpreadsheetColumnRangeReference other, + final boolean includeKind) { + return this.begin().equalsNotSameAndNotNull(other.begin(), includeKind) && + this.end().equalsNotSameAndNotNull(other.end(), includeKind); + } + + // toString......................................................................................................... + + @Override + public String toString() { + return this.isUnit() ? + this.begin().toString() : + this.begin() + SEPARATOR.string() + this.end(); + } // Comparable....................................................................................................... diff --git a/src/main/java/walkingkooka/spreadsheet/reference/SpreadsheetRowRangeReference.java b/src/main/java/walkingkooka/spreadsheet/reference/SpreadsheetRowRangeReference.java index 0e08f5660..2e3918f55 100644 --- a/src/main/java/walkingkooka/spreadsheet/reference/SpreadsheetRowRangeReference.java +++ b/src/main/java/walkingkooka/spreadsheet/reference/SpreadsheetRowRangeReference.java @@ -18,23 +18,31 @@ package walkingkooka.spreadsheet.reference; import walkingkooka.Cast; +import walkingkooka.collect.HasRange; +import walkingkooka.collect.HasRangeBounds; import walkingkooka.collect.Range; import walkingkooka.collect.RangeBound; +import walkingkooka.spreadsheet.formula.parser.SpreadsheetFormulaParserToken; import walkingkooka.text.CharSequences; import java.util.EnumSet; +import java.util.Iterator; import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.function.Predicate; +import java.util.stream.IntStream; /** * Holds a row range. */ @SuppressWarnings("lgtm[java/inconsistent-equals-and-hashcode]") -public final class SpreadsheetRowRangeReference extends SpreadsheetColumnOrRowRangeReference - implements Comparable { +public final class SpreadsheetRowRangeReference extends SpreadsheetColumnOrRowRangeReference + implements Comparable, + HasRange, + HasRangeBounds, + Iterable { /** * A {@link SpreadsheetRowRangeReference} that includes all rows. @@ -53,29 +61,56 @@ static SpreadsheetRowRangeReference with(final Range ra return new SpreadsheetRowRangeReference(range); } + private SpreadsheetRowRangeReference(final Range range) { + super(); + this.range = range; + } + /** - * Private ctor + * Returns the top left row/row reference. */ - private SpreadsheetRowRangeReference(final Range range) { - super(range); + @SuppressWarnings("OptionalGetWithoutIsPresent") + @Override + public SpreadsheetRowReference begin() { + return this.range.lowerBound() + .value() + .get(); // must exist } /** - * Creates a {@link SpreadsheetCellRangeReference} combining this row range and the given column range. + * Returns the bottom right row/row reference. */ - public SpreadsheetCellRangeReference setColumnRange(final SpreadsheetColumnRangeReference columnRangeReference) { - Objects.requireNonNull(columnRangeReference, "columnRangeReference"); + @SuppressWarnings("OptionalGetWithoutIsPresent") + @Override + public SpreadsheetRowReference end() { + return this.range.upperBound() + .value() + .get(); // must exist + } - return columnRangeReference.setRowRange(this); + @Override + public Range range() { + return this.range; } + private final Range range; + + public SpreadsheetRowRangeReference setRange(final Range range) { - return this.setRange0(range); + Objects.requireNonNull(range, "range"); + + return this.range.equals(range) ? + this : + with(range); } + + /** + * Creates a {@link SpreadsheetCellRangeReference} combining this row range and the given column range. + */ + public SpreadsheetCellRangeReference setColumnRange(final SpreadsheetColumnRangeReference columnRangeReference) { + Objects.requireNonNull(columnRangeReference, "columnRangeReference"); - @Override - SpreadsheetRowRangeReference replace(final Range range) { - return with(range); + return columnRangeReference.setRowRange(this); } // add.............................................................................................................. @@ -170,6 +205,40 @@ boolean testRowNonNull(final SpreadsheetRowReference row) { return this.range.test(row); } + // count............................................................................................................ + + /** + * Returns the number of rows in this range. + */ + @Override + public long count() { + return this.end() + .value() + - this.begin() + .value() + + 1; + } + + // isXXX............................................................................................................ + + @Override + public boolean isFirst() { + return this.begin().isFirst() && this.isUnit(); + } + + @Override + public boolean isLast() { + return this.begin().isLast() && this.isUnit(); + } + + // toXXX............................................................................................................ + + @Override + public SpreadsheetCellReference toCell() { + return this.toScalar() + .toCell(); + } + @Override public SpreadsheetColumnReference toColumn() { throw new UnsupportedOperationException(this.toString()); @@ -190,6 +259,13 @@ public SpreadsheetRowRangeReference toRowRange() { return this; } + // toScalar......................................................................................................... + + @Override + public SpreadsheetRowReference toScalar() { + return this.begin(); + } + // toRange.......................................................................................................... @Override @@ -210,18 +286,19 @@ public SpreadsheetRowRangeReference toRelative() { relative; } - // SpreadsheetSelectionVisitor...................................................................................... + // replaceReferencesMapper.......................................................................................... @Override - void accept(final SpreadsheetSelectionVisitor visitor) { - visitor.visit(this); + Optional>> replaceReferencesMapper0(final SpreadsheetSelection movedTo) { + return this.toScalar() + .replaceReferencesMapper0(movedTo); } - // Iterable......................................................................................................... + // SpreadsheetSelectionVisitor...................................................................................... @Override - SpreadsheetRowReference iteratorIntToReference(final int value) { - return SpreadsheetReferenceKind.RELATIVE.row(value); + void accept(final SpreadsheetSelectionVisitor visitor) { + visitor.visit(this); } // SpreadsheetViewportNavigation........................................................................... @@ -466,7 +543,56 @@ public SpreadsheetRowReference focused(final SpreadsheetViewportAnchor anchor) { .row(this); } - // Object........................................................................................................... + // Iterable......................................................................................................... + + @Override + public Iterator iterator() { + return IntStream.rangeClosed( + this.begin().value(), + this.end().value() + ) + .boxed() + .map(SpreadsheetReferenceKind.RELATIVE::row) + .iterator(); + } + + // HasParserToken................................................................................................... + + @Override + public SpreadsheetFormulaParserToken toParserToken() { + throw new UnsupportedOperationException(); + } + + // hashCode/equals.................................................................................................. + + @Override + public int hashCode() { + return this.range.hashCode(); + } + + @Override + boolean equalsNotSameAndNotNull(final Object other, + final boolean includeKind) { + return this.equals1( + (SpreadsheetRowRangeReference) other, + includeKind + ); + } + + private boolean equals1(final SpreadsheetRowRangeReference other, + final boolean includeKind) { + return this.begin().equalsNotSameAndNotNull(other.begin(), includeKind) && + this.end().equalsNotSameAndNotNull(other.end(), includeKind); + } + + // toString......................................................................................................... + + @Override + public String toString() { + return this.isUnit() ? + this.begin().toString() : + this.begin() + SEPARATOR.string() + this.end(); + } // Comparable....................................................................................................... diff --git a/src/test/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnOrRowRangeReferenceTest.java b/src/test/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnOrRowRangeReferenceTest.java index 572cee7bf..da7b678f3 100644 --- a/src/test/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnOrRowRangeReferenceTest.java +++ b/src/test/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnOrRowRangeReferenceTest.java @@ -17,11 +17,10 @@ package walkingkooka.spreadsheet.reference; -import walkingkooka.Cast; import walkingkooka.reflect.ClassTesting; import walkingkooka.reflect.JavaVisibility; -public final class SpreadsheetColumnOrRowRangeReferenceTest implements ClassTesting> { +public final class SpreadsheetColumnOrRowRangeReferenceTest implements ClassTesting { @Override public void testAllMethodsVisibility() { @@ -29,8 +28,8 @@ public void testAllMethodsVisibility() { } @Override - public Class> type() { - return Cast.to(SpreadsheetColumnOrRowRangeReference.class); + public Class type() { + return SpreadsheetColumnOrRowRangeReference.class; } @Override diff --git a/src/test/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnOrRowRangeReferenceTestCase.java b/src/test/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnOrRowRangeReferenceTestCase.java index d25f316e7..f3a8e7be7 100644 --- a/src/test/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnOrRowRangeReferenceTestCase.java +++ b/src/test/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnOrRowRangeReferenceTestCase.java @@ -24,7 +24,7 @@ import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertThrows; -public abstract class SpreadsheetColumnOrRowRangeReferenceTestCase & Comparable, +public abstract class SpreadsheetColumnOrRowRangeReferenceTestCase, R extends SpreadsheetColumnOrRowReference & Comparable> extends SpreadsheetSelectionTestCase implements ComparableTesting2 { diff --git a/src/test/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnOrRowReferenceKindTest.java b/src/test/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnOrRowReferenceKindTest.java index da69928e0..7c60be5d9 100644 --- a/src/test/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnOrRowReferenceKindTest.java +++ b/src/test/java/walkingkooka/spreadsheet/reference/SpreadsheetColumnOrRowReferenceKindTest.java @@ -486,7 +486,7 @@ public void testColumnOrRowRangeWithRow2() { private void columnOrRowRangeAndCheck(final SpreadsheetColumnOrRowReferenceKind kind, final SpreadsheetSelection selection, - final SpreadsheetColumnOrRowRangeReference expected) { + final SpreadsheetColumnOrRowRangeReference expected) { this.checkEquals( expected, kind.columnOrRowRange(selection), @@ -528,7 +528,7 @@ private void columnOrRowRangeIterateAndCheck(final SpreadsheetColumnOrRowReferen final SpreadsheetSelection selection, final List expected) { final List actual = Lists.array(); - for (final SpreadsheetColumnOrRowReference columnOrRowReference : kind.columnOrRowRange(selection)) { + for (final SpreadsheetSelection columnOrRowReference : (Iterable)kind.columnOrRowRange(selection)) { actual.add(columnOrRowReference); }