package org.batfish.datamodel; import java.io.Serializable; import java.util.LinkedList; import java.util.List; import org.batfish.common.BatfishException; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; public final class SubRange implements Serializable, Comparable<SubRange> { private static final long serialVersionUID = 1L; public static List<SubRange> invertedRange(int value, int min, int max) { List<SubRange> returnRange = new LinkedList<>(); if (value > min) { returnRange.add(new SubRange(min, value - 1)); } if (value < max) { returnRange.add(new SubRange(value + 1, max)); } return returnRange; } private final int _end; private final int _start; public SubRange(int start, int end) { _start = start; _end = end; } @JsonCreator public SubRange(Object o) { if (o instanceof String) { String s = (String) o; String[] parts = s.split("-"); if (parts.length != 2) { throw new BatfishException("Invalid subrange: \"" + s + "\""); } try { _start = Integer.parseInt(parts[0]); } catch (NumberFormatException e) { throw new BatfishException( "Invalid subrange start: \"" + parts[0] + "\"", e); } try { _end = Integer.parseInt(parts[1]); } catch (NumberFormatException e) { throw new BatfishException( "Invalid subrange end: \"" + parts[1] + "\"", e); } } else if (o instanceof Integer) { int i = ((Integer) o).intValue(); _start = i; _end = i; } else { throw new BatfishException( "Cannot creat SubRange from input object of type: " + o.getClass().getCanonicalName()); } } @Override public int compareTo(SubRange rhs) { int ret = Integer.compare(_start, rhs._start); if (ret == 0) { ret = Integer.compare(_end, rhs._end); } return ret; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } SubRange other = (SubRange) obj; if (_end != other._end) { return false; } if (_start != other._start) { return false; } return true; } public int getEnd() { return _end; } public int getStart() { return _start; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + _end; result = prime * result + _start; return result; } @JsonValue public String serializedForm() { return String.format("%d-%d", _start, _end); } @Override public String toString() { return "[" + _start + "," + _end + "]"; } }