blob: e05df4c4a116ad4267683332f6d400024a3eb49d [file] [log] [blame]
package org.projectfloodlight.openflow.types;
import org.jboss.netty.buffer.ChannelBuffer;
import com.google.common.hash.PrimitiveSink;
public class OFBitMask512 implements OFValueType<OFBitMask512> {
static final int LENGTH = 64;
private final long raw1;
private final long raw2;
private final long raw3;
private final long raw4;
private final long raw5;
private final long raw6;
private final long raw7;
private final long raw8;
public static final OFBitMask512 ALL = new OFBitMask512(-1, -1, -1, -1,
-1, -1, -1, -1);
public static final OFBitMask512 NONE = new OFBitMask512(0, 0, 0, 0,
0, 0, 0, 0);
public static final OFBitMask512 NO_MASK = ALL;
public static final OFBitMask512 FULL_MASK = NONE;
private OFBitMask512(long raw1, long raw2, long raw3, long raw4,
long raw5, long raw6, long raw7, long raw8) {
this.raw1 = raw1;
this.raw2 = raw2;
this.raw3 = raw3;
this.raw4 = raw4;
this.raw5 = raw5;
this.raw6 = raw6;
this.raw7 = raw7;
this.raw8 = raw8;
}
public static OFBitMask512 of(long raw1, long raw2, long raw3, long raw4,
long raw5, long raw6, long raw7, long raw8) {
if (raw1 == -1 && raw2 == -1 && raw3 == -1 && raw4 == -1
&& raw5 == -1 && raw6 == -1 && raw7 == -1 && raw8 == -1)
return ALL;
if (raw1 == 0 && raw2 == 0 && raw3 == 0 && raw4 == 0
&& raw5 == 0 && raw6 == 0 && raw7 == 0 && raw8 == 0)
return NONE;
return new OFBitMask512(raw1, raw2, raw3, raw4, raw5, raw6, raw7, raw8);
}
@Override
public int getLength() {
return LENGTH;
}
@Override
public OFBitMask512 applyMask(OFBitMask512 mask) {
return of(this.raw1 & mask.raw1, this.raw2 & mask.raw2,
this.raw3 & mask.raw3, this.raw4 & mask.raw4,
this.raw5 & mask.raw5, this.raw6 & mask.raw6,
this.raw7 & mask.raw7, this.raw8 & mask.raw8);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (int) (raw1 ^ (raw1 >>> 32));
result = prime * result + (int) (raw2 ^ (raw2 >>> 32));
result = prime * result + (int) (raw3 ^ (raw3 >>> 32));
result = prime * result + (int) (raw4 ^ (raw4 >>> 32));
result = prime * result + (int) (raw5 ^ (raw5 >>> 32));
result = prime * result + (int) (raw6 ^ (raw6 >>> 32));
result = prime * result + (int) (raw7 ^ (raw7 >>> 32));
result = prime * result + (int) (raw8 ^ (raw8 >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
OFBitMask512 other = (OFBitMask512) obj;
if (raw1 != other.raw1) return false;
if (raw2 != other.raw2) return false;
if (raw3 != other.raw3) return false;
if (raw4 != other.raw4) return false;
if (raw5 != other.raw5) return false;
if (raw6 != other.raw6) return false;
if (raw7 != other.raw7) return false;
if (raw8 != other.raw8) return false;
return true;
}
protected static boolean isBitOn(long raw1, long raw2, long raw3, long raw4,
long raw5, long raw6, long raw7, long raw8, int bit) {
if (bit < 0 || bit >= 512)
throw new IndexOutOfBoundsException();
long word;
if (bit < 64) {
word = raw8;
} else if (bit < 128) {
word = raw7;
bit -= 64;
} else if (bit < 128) {
word = raw6;
bit -= 128;
} else if (bit < 128) {
word = raw5;
bit -= 192;
} else if (bit < 128) {
word = raw4;
bit -= 256;
} else if (bit < 128) {
word = raw3;
bit -= 320;
} else if (bit < 128) {
word = raw2;
bit -= 384;
} else {
word = raw1; // ports -512
bit -= 448;
}
return (word & ((long)1 << bit)) != 0;
}
public void write64Bytes(ChannelBuffer cb) {
cb.writeLong(raw1);
cb.writeLong(raw2);
cb.writeLong(raw3);
cb.writeLong(raw4);
cb.writeLong(raw5);
cb.writeLong(raw6);
cb.writeLong(raw7);
cb.writeLong(raw8);
}
public static OFBitMask512 read64Bytes(ChannelBuffer cb) {
long raw1 = cb.readLong();
long raw2 = cb.readLong();
long raw3 = cb.readLong();
long raw4 = cb.readLong();
long raw5 = cb.readLong();
long raw6 = cb.readLong();
long raw7 = cb.readLong();
long raw8 = cb.readLong();
return of(raw1, raw2, raw3, raw4, raw5, raw6, raw7, raw8);
}
public boolean isOn(int bit) {
return isBitOn(raw1, raw2, raw3, raw4, raw5, raw6, raw7, raw8, bit);
}
@Override
public String toString() {
return (String.format("%64s", Long.toBinaryString(raw8))
+ String.format("%64s", Long.toBinaryString(raw7))
+ String.format("%64s", Long.toBinaryString(raw6))
+ String.format("%64s", Long.toBinaryString(raw5))
+ String.format("%64s", Long.toBinaryString(raw4))
+ String.format("%64s", Long.toBinaryString(raw3))
+ String.format("%64s", Long.toBinaryString(raw2))
+ String.format("%64s", Long.toBinaryString(raw1))).replaceAll(" ", "0");
}
@Override
public int compareTo(OFBitMask512 o) {
long c = this.raw1 - o.raw1;
if (c != 0)
return Long.signum(c);
c = this.raw2 - o.raw2;
if (c != 0)
return Long.signum(c);
c = this.raw3 - o.raw3;
if (c != 0)
return Long.signum(c);
c = this.raw4 - o.raw4;
if (c != 0)
return Long.signum(c);
c = this.raw5 - o.raw5;
if (c != 0)
return Long.signum(c);
c = this.raw6 - o.raw6;
if (c != 0)
return Long.signum(c);
c = this.raw7 - o.raw7;
if (c != 0)
return Long.signum(c);
return Long.signum(this.raw8 - o.raw8);
}
@Override
public void putTo(PrimitiveSink sink) {
sink.putLong(raw1);
sink.putLong(raw2);
sink.putLong(raw3);
sink.putLong(raw4);
sink.putLong(raw5);
sink.putLong(raw6);
sink.putLong(raw7);
sink.putLong(raw8);
}
}