package net.minecraft.server;
import java.util.function.IntConsumer;
import org.apache.commons.lang3.Validate;
public class DataBits {
private final long[] a;
private final int b;
private final long c;
private final int d;
public DataBits(int i, int j) {
this(i, j, new long[MathHelper.c(j * i, 64) / 64]);
}
public DataBits(int i, int j, long[] along) {
Validate.inclusiveBetween(1L, 32L, (long) i);
this.d = j;
this.b = i;
this.a = along;
this.c = (1L << i) - 1L;
int k = MathHelper.c(j * i, 64) / 64;
if (along.length != k) {
throw (RuntimeException) SystemUtils.c(new RuntimeException("Invalid length given for storage, got: " + along.length + " but expected: " + k));
}
}
public int a(int i, int j) {
Validate.inclusiveBetween(0L, (long) (this.d - 1), (long) i);
Validate.inclusiveBetween(0L, this.c, (long) j);
int k = i * this.b;
int l = k >> 6;
int i1 = (i + 1) * this.b - 1 >> 6;
int j1 = k ^ l << 6;
byte b0 = 0;
int k1 = b0 | (int) (this.a[l] >>> j1 & this.c);
this.a[l] = this.a[l] & ~(this.c << j1) | ((long) j & this.c) << j1;
if (l != i1) {
int l1 = 64 - j1;
int i2 = this.b - l1;
k1 |= (int) (this.a[i1] << l1 & this.c);
this.a[i1] = this.a[i1] >>> i2 << i2 | ((long) j & this.c) >> l1;
}
return k1;
}
public void b(int i, int j) {
Validate.inclusiveBetween(0L, (long) (this.d - 1), (long) i);
Validate.inclusiveBetween(0L, this.c, (long) j);
int k = i * this.b;
int l = k >> 6;
int i1 = (i + 1) * this.b - 1 >> 6;
int j1 = k ^ l << 6;
this.a[l] = this.a[l] & ~(this.c << j1) | ((long) j & this.c) << j1;
if (l != i1) {
int k1 = 64 - j1;
int l1 = this.b - k1;
this.a[i1] = this.a[i1] >>> l1 << l1 | ((long) j & this.c) >> k1;
}
}
public int a(int i) {
Validate.inclusiveBetween(0L, (long) (this.d - 1), (long) i);
int j = i * this.b;
int k = j >> 6;
int l = (i + 1) * this.b - 1 >> 6;
int i1 = j ^ k << 6;
if (k == l) {
return (int) (this.a[k] >>> i1 & this.c);
} else {
int j1 = 64 - i1;
return (int) ((this.a[k] >>> i1 | this.a[l] << j1) & this.c);
}
}
public long[] a() {
return this.a;
}
public int b() {
return this.d;
}
public int c() {
return this.b;
}
public void a(IntConsumer intconsumer) {
int i = this.a.length;
if (i != 0) {
int j = 0;
long k = this.a[0];
long l = i > 1 ? this.a[1] : 0L;
for (int i1 = 0; i1 < this.d; ++i1) {
int j1 = i1 * this.b;
int k1 = j1 >> 6;
int l1 = (i1 + 1) * this.b - 1 >> 6;
int i2 = j1 ^ k1 << 6;
if (k1 != j) {
k = l;
l = k1 + 1 < i ? this.a[k1 + 1] : 0L;
j = k1;
}
if (k1 == l1) {
intconsumer.accept((int) (k >>> i2 & this.c));
} else {
int j2 = 64 - i2;
intconsumer.accept((int) ((k >>> i2 | l << j2) & this.c));
}
}
}
}
}