protected <T> boolean createMany(StateAlias<T> state, Set<StateAlias<T>> visited) { if (!visited.add(state)) return false; boolean created = false; if (state.getOutgoing().contains(state)) { state.getElement().setMany(true); state.getOutgoing().remove(state); state.getIncoming().remove(state); created = true; } for (StateAlias<T> out : state.getOutgoing()) { if (createMany(out, visited)) created = true; } return created; }
protected <T> boolean createMany(StateAlias<T> state, Set<StateAlias<T>> visited) { if (!visited.add(state)) return false; boolean created = false; if (state.getOutgoing().contains(state)) { state.getElement().setMany(true); state.getOutgoing().remove(state); state.getIncoming().remove(state); created = true; } for (StateAlias<T> out : state.getOutgoing()) { if (createMany(out, visited)) created = true; } return created; }
protected <T> void mergeOptionalIntoMany(StateAlias<T> first, StateAlias<T> second) { StateAlias<T> many = first.element.isMany() ? first : second; StateAlias<T> optional = many == first ? second : first; if (optional.getOutgoing().contains(optional)) { optional.element.setMany(true); } many.element.setMany(false); optional.element.setOptional(true); for (StateAlias<T> out : optional.getOutgoing()) { out.getIncoming().remove(optional); } for (StateAlias<T> in : optional.getIncoming()) { in.getOutgoing().remove(optional); } GroupAlias<T> group = new GroupAlias<T>(); group.setMany(true); if (first.element instanceof GroupAlias<?> && !first.element.many && !first.element.optional) { group.children.addAll(((GroupAlias<T>) first.element).children); } else { group.addChild(first.getElement()); } if (second.element instanceof GroupAlias<?> && !second.element.many && !second.element.optional) { group.children.addAll(((GroupAlias<T>) second.element).children); } else { group.addChild(second.element); } many.element = group; }