summaryrefslogtreecommitdiff
path: root/src/main/java/com/it_jaros/jscanner/PortRangeIterator.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/it_jaros/jscanner/PortRangeIterator.java')
-rw-r--r--src/main/java/com/it_jaros/jscanner/PortRangeIterator.java38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/main/java/com/it_jaros/jscanner/PortRangeIterator.java b/src/main/java/com/it_jaros/jscanner/PortRangeIterator.java
new file mode 100644
index 0000000..6690957
--- /dev/null
+++ b/src/main/java/com/it_jaros/jscanner/PortRangeIterator.java
@@ -0,0 +1,38 @@
+package com.it_jaros.jscanner;
+
+import java.util.BitSet;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+import static com.it_jaros.jscanner.PortRange.MAX_PORT;
+import static com.it_jaros.jscanner.PortRange.MIN_PORT;
+
+public class PortRangeIterator implements Iterator<Integer> {
+
+ private int currentPortCursor;
+ private int done = 0;
+ private final BitSet availablePorts = new BitSet(MAX_PORT);
+
+ PortRangeIterator(BitSet specifiedPorts) {
+ availablePorts.or(specifiedPorts);
+ currentPortCursor = availablePorts.nextSetBit(MIN_PORT);
+ }
+
+ @Override
+ public Integer next() {
+ int p = availablePorts.nextSetBit(currentPortCursor);
+ if (p > 0) {
+ availablePorts.clear(p);
+ currentPortCursor = p + 1;
+ done++;
+ return p;
+ }
+
+ throw new NoSuchElementException("Reached end of port range");
+ }
+
+ @Override
+ public boolean hasNext() {
+ return availablePorts.nextSetBit(currentPortCursor) > 0;
+ }
+}