ee2c6b5e2ae8a5fda2c4354bb2102473421a7ef5
[slipway.git] / src / edu / berkeley / obits / Bits.java
1 package edu.berkeley.obits;
2
3 public abstract class Bits {
4     /*
5     public abstract boolean get(long bit);
6     public abstract void    set(long bit, boolean val);
7
8     public int get(long bit, int len) {
9         int ret = 0;
10         for(long i=bit; i<bit+len; i++) ret = (ret << 1) | get(i);
11         return ret;
12     }
13     public void set(long bit, int len, int val) {
14         for(long i=bit+len-1; i>=bit; i--) {
15             set(i, (val & 1) != 0);
16             val >>= 1;
17         }
18     }
19
20     public final boolean get(int offset, int bit) { return get(offset*8 + bit); }
21     public final int     get(int offset, int bit, int len) { return get(offset*8 + bit, num); }
22     public final void    set(int offset, int bit, boolean b) { set(offset*8 + bit, b); }
23     public final void    set(int offset, int bit, int len, int val) { set(offset*8 + bit, num, val); }
24
25     public static class Offset extends Bits {
26         private final Bits bits;
27         private final long off;
28
29         public Offset(Bits bits, long offset) { this.off = offset; this.bits = bits; }
30         public Offset(Bits bits, int offset, int bit) { this(bits, offset*8+bit); }
31
32         public boolean get(long bit) { return bits.get(bit+off); }
33         public int     get(long bit, int len) { return bits.get(bit+off, len); }
34         public void    set(long bit, boolean val) { bits.set(bit+off, val); }
35         public void    set(long bit, int len, int val) { bits.set(bit+off, len, val); }
36     }
37
38     public static class Arr extends Bits {
39         private byte[] bits;
40         public Bits(int capacity) { this.bits = new byte[(capacity / 8) + (capacity%8 == 0 ? 0 : 1)]; }
41
42         public boolean get(long bit) {
43             if (bit / 8 >= bits.length) return false;
44             int ret = bits[bit/8];
45             ret >> 8-(bit-((bit/8)*8));
46             return (ret & 1) != 0;
47         }
48
49         public void set(long bit, boolean b) {
50             if (bit / 8 >= bits.length) {
51                 if (!b) return;
52                 byte[] bits2 = new byte[Math.max((bit/8)+1, (bits.length * 2))];
53                 System.arraycopy(bits, 0, bits2, 0, bits.length);
54                 bits = bits2;
55                 set(bit, b);
56                 return;
57             }
58             byte mask = (byte)(1 << (8-(bit-((bit/8)*8))));
59             if (b) {
60                 bits[bit/8] |=  mask;
61             } else {
62                 bits[bit/8] &= ~mask;
63             }
64         }
65         
66     }
67     */
68 }