package org.projectfloodlight.openflow.types;

import org.jboss.netty.buffer.ChannelBuffer;

public class OFBitMask128 implements OFValueType<OFBitMask128> {

    static final int LENGTH = 16;

    private final long raw1; // MSBs (ports 64-127)
    private final long raw2; // LSBs (ports 0-63)

    public static final OFBitMask128 ALL = new OFBitMask128(-1, -1);
    public static final OFBitMask128 NONE = new OFBitMask128(0, 0);

    private OFBitMask128(long raw1, long raw2) {
        this.raw1 = raw1;
        this.raw2 = raw2;
    }

    static OFBitMask128 of(long raw1, long raw2) {
        if (raw1 == -1 && raw2 == -1)
            return ALL;
        if (raw1 == 0 && raw2 == 0)
            return NONE;
        return new OFBitMask128(raw1, raw2);
    }

    @Override
    public int getLength() {
        return LENGTH;
    }

    @Override
    public OFBitMask128 applyMask(OFBitMask128 mask) {
        return of(this.raw1 & mask.raw1, this.raw2 & mask.raw2);
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof OFBitMask128))
            return false;
        OFBitMask128 other = (OFBitMask128)obj;
        return (other.raw1 == this.raw1 && other.raw2 == this.raw2);
    }

    @Override
    public int hashCode() {
        return (int)(31 * raw1 + raw2);
    }

    protected static boolean isBitOn(long raw1, long raw2, int bit) {
        if (bit < 0 || bit >= 128)
            throw new IndexOutOfBoundsException();
        long word;
        if (bit < 64) {
            word = raw2; // ports 0-63
        } else {
            word = raw1; // ports 64-127
            bit -= 64;
        }
        return (word & ((long)1 << bit)) != 0;
    }

    public void write16Bytes(ChannelBuffer cb) {
        cb.writeLong(raw1);
        cb.writeLong(raw2);
    }

    public static OFBitMask128 read16Bytes(ChannelBuffer cb) {
        long raw1 = cb.readLong();
        long raw2 = cb.readLong();
        return of(raw1, raw2);
    }

    public boolean isOn(int bit) {
        return isBitOn(raw1, raw2, bit);
    }

    @Override
    public String toString() {
        return (String.format("%64s", Long.toBinaryString(raw2)) + String.format("%64s", Long.toBinaryString(raw1))).replaceAll(" ", "0");
    }

    @Override
    public int compareTo(OFBitMask128 o) {
        long c = this.raw1 - o.raw1;
        if (c != 0)
            return Long.signum(c);
        return Long.signum(this.raw2 - o.raw2);
    }

}
