blob: e3686a406e303b7315d8244c9b30f736248633bb [file] [log] [blame]
Sovietaceda0aca272014-12-31 15:11:42 -05001package org.projectfloodlight.openflow.types;
2
3import org.jboss.netty.buffer.ChannelBuffer;
4
5import com.google.common.hash.PrimitiveSink;
6
7public class OFBitMask512 implements OFValueType<OFBitMask512> {
8
9 static final int LENGTH = 64;
10
11 private final long raw1;
12 private final long raw2;
13 private final long raw3;
14 private final long raw4;
15 private final long raw5;
16 private final long raw6;
17 private final long raw7;
18 private final long raw8;
19
20 public static final OFBitMask512 ALL = new OFBitMask512(-1, -1, -1, -1,
21 -1, -1, -1, -1);
22 public static final OFBitMask512 NONE = new OFBitMask512(0, 0, 0, 0,
23 0, 0, 0, 0);
24
25 public static final OFBitMask512 NO_MASK = ALL;
26 public static final OFBitMask512 FULL_MASK = NONE;
27
28 private OFBitMask512(long raw1, long raw2, long raw3, long raw4,
29 long raw5, long raw6, long raw7, long raw8) {
30 this.raw1 = raw1;
31 this.raw2 = raw2;
32 this.raw3 = raw3;
33 this.raw4 = raw4;
34 this.raw5 = raw5;
35 this.raw6 = raw6;
36 this.raw7 = raw7;
37 this.raw8 = raw8;
38 }
39
40 public static OFBitMask512 of(long raw1, long raw2, long raw3, long raw4,
41 long raw5, long raw6, long raw7, long raw8) {
42 if (raw1 == -1 && raw2 == -1 && raw3 == -1 && raw4 == -1
43 && raw5 == -1 && raw6 == -1 && raw7 == -1 && raw8 == -1)
44 return ALL;
45 if (raw1 == 0 && raw2 == 0 && raw3 == 0 && raw4 == 0
46 && raw5 == 0 && raw6 == 0 && raw7 == 0 && raw8 == 0)
47 return NONE;
48 return new OFBitMask512(raw1, raw2, raw3, raw4, raw5, raw6, raw7, raw8);
49 }
50
51 @Override
52 public int getLength() {
53 return LENGTH;
54 }
55
56 @Override
57 public OFBitMask512 applyMask(OFBitMask512 mask) {
58 return of(this.raw1 & mask.raw1, this.raw2 & mask.raw2,
59 this.raw3 & mask.raw3, this.raw4 & mask.raw4,
60 this.raw5 & mask.raw5, this.raw6 & mask.raw6,
61 this.raw7 & mask.raw7, this.raw8 & mask.raw8);
62 }
63
64 @Override
65 public int hashCode() {
66 final int prime = 31;
67 int result = 1;
68 result = prime * result + (int) (raw1 ^ (raw1 >>> 32));
69 result = prime * result + (int) (raw2 ^ (raw2 >>> 32));
70 result = prime * result + (int) (raw3 ^ (raw3 >>> 32));
71 result = prime * result + (int) (raw4 ^ (raw4 >>> 32));
72 result = prime * result + (int) (raw5 ^ (raw5 >>> 32));
73 result = prime * result + (int) (raw6 ^ (raw6 >>> 32));
74 result = prime * result + (int) (raw7 ^ (raw7 >>> 32));
75 result = prime * result + (int) (raw8 ^ (raw8 >>> 32));
76 return result;
77 }
78
79 @Override
80 public boolean equals(Object obj) {
81 if (this == obj) return true;
82 if (obj == null) return false;
83 if (getClass() != obj.getClass()) return false;
84 OFBitMask512 other = (OFBitMask512) obj;
85 if (raw1 != other.raw1) return false;
86 if (raw2 != other.raw2) return false;
87 if (raw3 != other.raw3) return false;
88 if (raw4 != other.raw4) return false;
89 if (raw5 != other.raw5) return false;
90 if (raw6 != other.raw6) return false;
91 if (raw7 != other.raw7) return false;
92 if (raw8 != other.raw8) return false;
93 return true;
94 }
95
96 protected static boolean isBitOn(long raw1, long raw2, long raw3, long raw4,
97 long raw5, long raw6, long raw7, long raw8, int bit) {
98 if (bit < 0 || bit >= 512)
99 throw new IndexOutOfBoundsException();
100 long word;
101 if (bit < 64) {
102 word = raw8;
103 } else if (bit < 128) {
104 word = raw7;
105 bit -= 64;
Shudong Zhou8e344712015-02-01 23:42:53 -0800106 } else if (bit < 192) {
Sovietaceda0aca272014-12-31 15:11:42 -0500107 word = raw6;
108 bit -= 128;
Shudong Zhou8e344712015-02-01 23:42:53 -0800109 } else if (bit < 256) {
Sovietaceda0aca272014-12-31 15:11:42 -0500110 word = raw5;
111 bit -= 192;
Shudong Zhou8e344712015-02-01 23:42:53 -0800112 } else if (bit < 320) {
Sovietaceda0aca272014-12-31 15:11:42 -0500113 word = raw4;
114 bit -= 256;
Shudong Zhou8e344712015-02-01 23:42:53 -0800115 } else if (bit < 384) {
Sovietaceda0aca272014-12-31 15:11:42 -0500116 word = raw3;
117 bit -= 320;
Shudong Zhou8e344712015-02-01 23:42:53 -0800118 } else if (bit < 448) {
Sovietaceda0aca272014-12-31 15:11:42 -0500119 word = raw2;
120 bit -= 384;
121 } else {
Sovietaced25021ec2014-12-31 15:44:21 -0500122 word = raw1;
Sovietaceda0aca272014-12-31 15:11:42 -0500123 bit -= 448;
124 }
125 return (word & ((long)1 << bit)) != 0;
126 }
127
128 public void write64Bytes(ChannelBuffer cb) {
129 cb.writeLong(raw1);
130 cb.writeLong(raw2);
131 cb.writeLong(raw3);
132 cb.writeLong(raw4);
133 cb.writeLong(raw5);
134 cb.writeLong(raw6);
135 cb.writeLong(raw7);
136 cb.writeLong(raw8);
137 }
138
139 public static OFBitMask512 read64Bytes(ChannelBuffer cb) {
140 long raw1 = cb.readLong();
141 long raw2 = cb.readLong();
142 long raw3 = cb.readLong();
143 long raw4 = cb.readLong();
144 long raw5 = cb.readLong();
145 long raw6 = cb.readLong();
146 long raw7 = cb.readLong();
147 long raw8 = cb.readLong();
148 return of(raw1, raw2, raw3, raw4, raw5, raw6, raw7, raw8);
149 }
150
151 public boolean isOn(int bit) {
152 return isBitOn(raw1, raw2, raw3, raw4, raw5, raw6, raw7, raw8, bit);
153 }
154
155 @Override
156 public String toString() {
157 return (String.format("%64s", Long.toBinaryString(raw8))
158 + String.format("%64s", Long.toBinaryString(raw7))
159 + String.format("%64s", Long.toBinaryString(raw6))
160 + String.format("%64s", Long.toBinaryString(raw5))
161 + String.format("%64s", Long.toBinaryString(raw4))
162 + String.format("%64s", Long.toBinaryString(raw3))
163 + String.format("%64s", Long.toBinaryString(raw2))
164 + String.format("%64s", Long.toBinaryString(raw1))).replaceAll(" ", "0");
165 }
166
167 @Override
168 public int compareTo(OFBitMask512 o) {
169 long c = this.raw1 - o.raw1;
170 if (c != 0)
171 return Long.signum(c);
172 c = this.raw2 - o.raw2;
173 if (c != 0)
174 return Long.signum(c);
175 c = this.raw3 - o.raw3;
176 if (c != 0)
177 return Long.signum(c);
178 c = this.raw4 - o.raw4;
179 if (c != 0)
180 return Long.signum(c);
181 c = this.raw5 - o.raw5;
182 if (c != 0)
183 return Long.signum(c);
184 c = this.raw6 - o.raw6;
185 if (c != 0)
186 return Long.signum(c);
187 c = this.raw7 - o.raw7;
188 if (c != 0)
189 return Long.signum(c);
190 return Long.signum(this.raw8 - o.raw8);
191 }
192
193 @Override
194 public void putTo(PrimitiveSink sink) {
195 sink.putLong(raw1);
196 sink.putLong(raw2);
197 sink.putLong(raw3);
198 sink.putLong(raw4);
199 sink.putLong(raw5);
200 sink.putLong(raw6);
201 sink.putLong(raw7);
202 sink.putLong(raw8);
203 }
204
205}