blob: 8ec056ed7038320ed6c9e6d29f637b1e7dcb0ff5 [file] [log] [blame]
package org.projectfloodlight.openflow.types;
public class OFPortMap extends Masked<OFBitMask128> {
private OFPortMap(OFBitMask128 mask) {
super(OFBitMask128.NONE, mask);
}
public boolean isOn(OFPort port) {
return !(this.mask.isOn(port.getPortNumber()));
}
public static OFPortMap ofPorts(OFPort... ports) {
Builder builder = new Builder();
for (OFPort port: ports) {
builder.set(port);
}
return builder.build();
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof OFPortMap))
return false;
OFPortMap other = (OFPortMap)obj;
return (other.value.equals(this.value) && other.mask.equals(this.mask));
}
@Override
public int hashCode() {
return 619 * mask.hashCode() + 257 * value.hashCode();
}
public static class Builder {
private long raw1 = -1, raw2 = -1;
public Builder() {
}
public boolean isOn(OFPort port) {
return !(OFBitMask128.isBitOn(raw1, raw2, port.getPortNumber()));
}
public Builder unset(OFPort port) {
int bit = port.getPortNumber();
if (bit < 0 || bit >= 127) // MAX PORT IS 127
throw new IndexOutOfBoundsException("Port number is out of bounds");
if (bit < 64) {
raw2 |= ((long)1 << bit);
} else {
raw1 |= ((long)1 << (bit - 64));
}
return this;
}
public Builder set(OFPort port) {
int bit = port.getPortNumber();
if (bit < 0 || bit >= 127)
throw new IndexOutOfBoundsException("Port number is out of bounds");
if (bit < 64) {
raw2 &= ~((long)1 << bit);
} else {
raw1 &= ~((long)1 << (bit - 64));
}
return this;
}
public OFPortMap build() {
return new OFPortMap(OFBitMask128.of(raw1, raw2));
}
}
}