package com.oracle.truffle.regex.tregex.dfa;
import java.util.Arrays;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.regex.charset.CodePointSet;
import com.oracle.truffle.regex.tregex.automaton.AbstractTransition;
import com.oracle.truffle.regex.tregex.automaton.StateSet;
import com.oracle.truffle.regex.tregex.automaton.TransitionBuilder;
import com.oracle.truffle.regex.tregex.automaton.TransitionSet;
import com.oracle.truffle.regex.tregex.nfa.NFA;
import com.oracle.truffle.regex.tregex.nfa.NFAState;
import com.oracle.truffle.regex.tregex.nfa.NFAStateTransition;
import com.oracle.truffle.regex.tregex.util.json.Json;
import com.oracle.truffle.regex.tregex.util.json.JsonArray;
import com.oracle.truffle.regex.tregex.util.json.JsonConvertible;
import com.oracle.truffle.regex.tregex.util.json.JsonValue;
public class DFAStateTransitionBuilder extends TransitionBuilder<NFA, NFAState, NFAStateTransition> implements AbstractTransition<DFAStateNodeBuilder, DFAStateTransitionBuilder>, JsonConvertible {
private int id = -1;
private DFAStateNodeBuilder source;
private DFAStateNodeBuilder target;
public DFAStateTransitionBuilder(NFAStateTransition[] transitions, StateSet<NFA, NFAState> targetStateSet, CodePointSet matcherBuilder) {
super(transitions, targetStateSet, matcherBuilder);
}
public DFAStateTransitionBuilder(TransitionSet<NFA, NFAState, NFAStateTransition> transitionSet, CodePointSet matcherBuilder) {
super(transitionSet, matcherBuilder);
}
public DFAStateTransitionBuilder createNodeSplitCopy() {
return new DFAStateTransitionBuilder(getTransitionSet(), getCodePointSet());
}
@Override
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public DFAStateNodeBuilder getSource() {
return source;
}
public void setSource(DFAStateNodeBuilder source) {
this.source = source;
}
@Override
public DFAStateNodeBuilder getTarget() {
return target;
}
public void setTarget(DFAStateNodeBuilder target) {
this.target = target;
}
@TruffleBoundary
@Override
public String toString() {
return source + " -" + getCodePointSet() + "-> " + target;
}
@TruffleBoundary
@Override
public JsonValue toJson() {
JsonArray nfaTransitions = Json.array(Arrays.stream(getTransitionSet().getTransitions()).map(t -> Json.val(t.getId())));
if (target.getAnchoredFinalStateTransition() != null) {
nfaTransitions.append(Json.val(target.getAnchoredFinalStateTransition().getId()));
}
if (target.getUnAnchoredFinalStateTransition() != null) {
nfaTransitions.append(Json.val(target.getUnAnchoredFinalStateTransition().getId()));
}
return Json.obj(Json.prop("id", id),
Json.prop("source", source.getId()),
Json.prop("target", target.getId()),
Json.prop("matcherBuilder", getCodePointSet().toString()),
Json.prop("nfaTransitions", nfaTransitions));
}
}