package com.fulmicoton.multiregexp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import dk.brics.automaton.State;
class MultiState {
private final State[] states;
public MultiState(State[] states) {
this.states = states;
}
public boolean isNull() {
for (State state: this.states) {
if (state != null) {
return false;
}
}
return true;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MultiState that = (MultiState) o;
return Arrays.equals(states, that.states);
}
@Override
public int hashCode() {
return Arrays.hashCode(states);
}
public MultiState step(char token) {
State[] nextStates = new State[this.states.length];
for (int c=0; c< this.states.length; c++) {
State prevState = this.states[c];
if (prevState == null) {
nextStates[c] = null;
}
else {
nextStates[c] = this.states[c].step(token);
}
}
return new MultiState(nextStates);
}
public int[] toAcceptValues() {
List<Integer> acceptValues = new ArrayList<>();
for (int stateId=0; stateId<this.states.length; stateId++) {
State curState = this.states[stateId];
if ((curState != null) && (curState.isAccept())) {
acceptValues.add(stateId);
}
}
int[] acceptValuesArr = new int[acceptValues.size()];
for (int c=0; c<acceptValues.size(); c++) {
acceptValuesArr[c] = acceptValues.get(c);
}
return acceptValuesArr;
}
}