1674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/*
2674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Copyright 2003 The Apache Software Foundation
3674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *
4674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *  Licensed under the Apache License, Version 2.0 (the "License");
5674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * you may not use this file except in compliance with the License.
6674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * You may obtain a copy of the License at
7674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *
8674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *      http://www.apache.org/licenses/LICENSE-2.0
9674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *
10674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *  Unless required by applicable law or agreed to in writing, software
11674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * distributed under the License is distributed on an "AS IS" BASIS,
12674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * See the License for the specific language governing permissions and
14674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * limitations under the License.
15674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */
16674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenpackage org.mockito.cglib.core;
17674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
18674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenpublic class TinyBitSet {
19674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private static int[] T = new int[256];
20674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private int value = 0;
21674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
22674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private static int gcount(int x) {
23674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int c = 0;
24674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        while (x != 0) {
25674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            c++;
26674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            x &= (x - 1);
27674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
28674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return c;
29674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
30674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
31674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static {
32674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        for(int j = 0; j < 256; j++) {
33674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            T[j] = gcount(j);
34674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
35674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
36674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
37674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private static int topbit(int i) {
38674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int j;
39674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        for (j = 0; i != 0; i ^= j) {
40674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            j = i & -i;
41674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
42674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return j;
43674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
44674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
45674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private static int log2(int i) {
46674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int j = 0;
47674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        for (j = 0; i != 0; i >>= 1) {
48674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            j++;
49674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
50674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return j;
51674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
52674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
53674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public int length() {
54674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return log2(topbit(value));
55674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
56674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
57674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public int cardinality() {
58674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int w = value;
59674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int c = 0;
60674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        while (w != 0) {
61674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            c += T[w & 255];
62674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            w >>= 8;
63674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
64674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return c;
65674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
66674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
67674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public boolean get(int index) {
68674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return (value & (1 << index)) != 0;
69674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
70674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
71674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void set(int index) {
72674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        value |= (1 << index);
73674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
74674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
75674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void clear(int index) {
76674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        value &= ~(1 << index);
77674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
78674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen}
79