Skip to content

Commit

Permalink
Merge pull request #5988 from mP1/feature/SpreadsheetColumnOrRowRefer…
Browse files Browse the repository at this point in the history
…ence-pulled-all-members

SpreadsheetColumnOrRowReference pulled all members
  • Loading branch information
mP1 authored Mar 3, 2025
2 parents 9a3703d + 1903fd0 commit 60831f0
Show file tree
Hide file tree
Showing 8 changed files with 457 additions and 232 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,117 +19,15 @@

import walkingkooka.Value;

import java.util.EnumSet;
import java.util.Objects;
import java.util.Set;

/**
* Captures the common features shared by a row or column.
*/
@SuppressWarnings("lgtm[java/inconsistent-equals-and-hashcode]")
abstract public class SpreadsheetColumnOrRowReference extends SpreadsheetSelection implements Value<Integer> {

/**
* Package private to limit subclassing.
*/
SpreadsheetColumnOrRowReference(final int value, final SpreadsheetReferenceKind referenceKind) {
this.value = value;
this.referenceKind = referenceKind;
}

@Override
public final long count() {
return 1;
}

/**
* Only returns true if this is the first column or row.
*/
@Override
public final boolean isFirst() {
return this.value == 0;
}

/**
* Only returns true if this is the last column or row.
*/
@Override
public final boolean isLast() {
return this.value == this.max();
}

/**
* Returns the maximum valid value, this is used during {@link #addSaturated(int)}
*/
abstract int max();

abstract SpreadsheetColumnOrRowReference setValue(final int value);

@Override
public final Integer value() {
return this.value;
}

final int value;

public final SpreadsheetReferenceKind referenceKind() {
return this.referenceKind;
}

abstract SpreadsheetColumnOrRowReference setReferenceKind(final SpreadsheetReferenceKind referenceKind);

final SpreadsheetColumnOrRowReference setReferenceKind0(final SpreadsheetReferenceKind referenceKind) {
Objects.requireNonNull(referenceKind, "referenceKind");

return this.referenceKind == referenceKind ?
this :
this.replaceReferenceKind(referenceKind);
}

private final SpreadsheetReferenceKind referenceKind;

/**
* Unconditionally creates a new {@link SpreadsheetColumnOrRowReference} with the given {@link SpreadsheetReferenceKind}.
*/
abstract SpreadsheetColumnOrRowReference replaceReferenceKind(final SpreadsheetReferenceKind referenceKind);

@Override
final Set<SpreadsheetViewportAnchor> anchors() {
return ANCHORS;
}

private final static Set<SpreadsheetViewportAnchor> ANCHORS = EnumSet.of(SpreadsheetViewportAnchor.NONE);

/**
* A column or row is already simplified.
*/
@Override
public final SpreadsheetSelection toScalar() {
return this;
}

// Object...........................................................................................................

@Override
public final int hashCode() {
return Objects.hash(this.value, this.referenceKind);
SpreadsheetColumnOrRowReference() {
super();
}

@Override
boolean equalsNotSameAndNotNull(final Object other,
final boolean includeKind) {
return this.equals1(
(SpreadsheetColumnOrRowReference) other,
includeKind
);
}

boolean equals1(final SpreadsheetColumnOrRowReference other,
final boolean includeKind) {
return this.value == other.value &&
(includeKind ? this.referenceKind == other.referenceKind : true);
}

// Comparable.......................................................................................................

}
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,10 @@
import walkingkooka.spreadsheet.formula.parser.ColumnSpreadsheetFormulaParserToken;
import walkingkooka.spreadsheet.formula.parser.SpreadsheetFormulaParserToken;

import java.util.EnumSet;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import java.util.function.Predicate;

Expand Down Expand Up @@ -97,27 +99,70 @@ static SpreadsheetColumnReference with(final int value, final SpreadsheetReferen
/**
* Private ctor use factory
*/
private SpreadsheetColumnReference(final int value, final SpreadsheetReferenceKind referenceKind) {
super(value, referenceKind);
private SpreadsheetColumnReference(final int value,
final SpreadsheetReferenceKind referenceKind) {
super();

this.value = value;
this.referenceKind = referenceKind;
}

@Override
public Integer value() {
return this.value;
}

final int value;

/**
* Would be setter that returns a {@link SpreadsheetColumnReference} with the given value creating a new
* instance if it is different.
*/
public SpreadsheetColumnReference setValue(final int value) {
checkValue(value);
return this.value == value ?
this :
new SpreadsheetColumnReference(value, this.referenceKind());
}

private static void checkValue(final int value) {
if (value < 0 || value > MAX_VALUE) {
throw new IllegalColumnArgumentException(
"Invalid column value " + value + " expected between 0 and " + (1 + MAX_VALUE)
);
}
}

public SpreadsheetReferenceKind referenceKind() {
return this.referenceKind;
}

private final SpreadsheetReferenceKind referenceKind;

/**
* Would be setter that returns a {@link SpreadsheetColumnReference} with the given {@link SpreadsheetReferenceKind}
* creating a new instance if necessary.
*/
@Override
public SpreadsheetColumnReference setReferenceKind(final SpreadsheetReferenceKind referenceKind) {
Objects.requireNonNull(referenceKind, "referenceKind");

return this.setReferenceKind0(referenceKind)
.toColumn();
return this.referenceKind == referenceKind ?
this :
new SpreadsheetColumnReference(
this.value,
referenceKind
);
}

@Override
SpreadsheetColumnReference replaceReferenceKind(final SpreadsheetReferenceKind referenceKind) {
return new SpreadsheetColumnReference(this.value, referenceKind);
Set<SpreadsheetViewportAnchor> anchors() {
return ANCHORS;
}

private final static Set<SpreadsheetViewportAnchor> ANCHORS = EnumSet.of(SpreadsheetViewportAnchor.NONE);

// add..............................................................................................................

@Override
public SpreadsheetColumnReference add(final int value) {
return this.setValue(
Expand Down Expand Up @@ -179,35 +224,10 @@ Optional<Function<SpreadsheetCellReference, Optional<SpreadsheetCellReference>>>

// max.............................................................................................................

@Override
int max() {
return MAX_VALUE;
}

/**
* Would be setter that returns a {@link SpreadsheetColumnReference} with the given value creating a new
* instance if it is different.
*/
@Override
public SpreadsheetColumnReference setValue(final int value) {
checkValue(value);
return this.value == value ?
this :
new SpreadsheetColumnReference(value, this.referenceKind());
}

private static void checkValue(final int value) {
if (value < 0 || value > MAX_VALUE) {
throw new IllegalColumnArgumentException(
invalidColumnValue(value)
);
}
}

private static String invalidColumnValue(final int value) {
return "Invalid column value " + value + " expected between 0 and " + (1 + MAX_VALUE);
}

/**
* Creates a {@link SpreadsheetCellReference} fromt this column and the new row.
*/
Expand Down Expand Up @@ -305,7 +325,7 @@ void accept(final SpreadsheetSelectionVisitor visitor) {
visitor.visit(this);
}

// range/columnRange.......................................................................................
// range/columnRange................................................................................................

/**
* Creates a {@link Range} with the given {@link SpreadsheetColumnReference}.
Expand All @@ -325,6 +345,31 @@ public SpreadsheetColumnRangeReference columnRange(final SpreadsheetColumnRefere
);
}

// isXXX............................................................................................................

@Override
public long count() {
return 1;
}

/**
* Only returns true if this is the first column or row.
*/
@Override
public boolean isFirst() {
return this.value == 0;
}

/**
* Only returns true if this is the last column or row.
*/
@Override
public boolean isLast() {
return this.value == this.max();
}

// toXXX............................................................................................................

@Override
public SpreadsheetColumnReference toColumn() {
return this;
Expand All @@ -348,6 +393,14 @@ public SpreadsheetRowRangeReference toRowRange() {
throw new UnsupportedOperationException(this.toString());
}

/**
* A column or row is already simplified.
*/
@Override
public SpreadsheetSelection toScalar() {
return this;
}

// toRange..........................................................................................................

@Override
Expand Down Expand Up @@ -562,6 +615,28 @@ public ColumnSpreadsheetFormulaParserToken toParserToken() {

// Object...........................................................................................................

@Override
public int hashCode() {
return Objects.hash(this.value, this.referenceKind);
}

@Override
boolean equalsNotSameAndNotNull(final Object other,
final boolean includeKind) {
return this.equals1(
(SpreadsheetColumnReference) other,
includeKind
);
}

boolean equals1(final SpreadsheetColumnReference other,
final boolean includeKind) {
return this.value == other.value &&
(includeKind ? this.referenceKind == other.referenceKind : true);
}

// Object...........................................................................................................

@Override
public String toString() {
return toString0(this.value, this.referenceKind());
Expand Down
Loading

0 comments on commit 60831f0

Please sign in to comment.