Javolution 6.0.0 java
BitSetServiceImpl.java
Go to the documentation of this file.
1 /*
2  * Javolution - Java(TM) Solution for Real-Time and Embedded Systems
3  * Copyright (C) 2012 - Javolution (http://javolution.org/)
4  * All rights reserved.
5  *
6  * Permission to use, copy, modify, and distribute this software is
7  * freely granted, provided that this notice is preserved.
8  */
9 package javolution.util.internal.bitset;
10 
11 import java.io.Serializable;
12 import java.util.Iterator;
13 
14 import javolution.lang.MathLib;
15 import javolution.util.Index;
20 
24 public class BitSetServiceImpl extends SetView<Index> implements BitSetService, Serializable {
25 
26  private static final long serialVersionUID = 0x600L; // Version.
27 
29  private long[] bits;
30 
32  public BitSetServiceImpl() {
33  super(null); // Root.
34  bits = new long[0];
35  }
36 
37  @Override
38  public boolean add(Index index) {
39  return !getAndSet(index.intValue(), true);
40  }
41 
42  @Override
43  public void and(BitSetService that) {
44  long[] thatBits = that.toLongArray();
45  int n = MathLib.min(this.bits.length, thatBits.length);
46  for (int i = 0; i < n; i++) {
47  this.bits[i] &= thatBits[i];
48  }
49  for (int i = n; i < bits.length; i++) {
50  this.bits[i] = 0L;
51  }
52  trim();
53  }
54 
55  @Override
56  public void andNot(BitSetService that) {
57  long[] thatBits = that.toLongArray();
58  int n = MathLib.min(this.bits.length, thatBits.length);
59  for (int i = 0; i < n; i++) {
60  this.bits[i] &= ~thatBits[i];
61  }
62  trim();
63  }
64 
65  @Override
66  public int cardinality() {
67  int sum = 0;
68  for (int i = 0; i < bits.length; i++) {
69  sum += MathLib.bitCount(bits[i]);
70  }
71  return sum;
72  }
73 
74  @Override
75  public void clear() {
76  bits = new long[0];
77  }
78 
79  @Override
80  public void clear(int bitIndex) {
81  int longIndex = bitIndex >> 6;
82  if (longIndex >= bits.length)
83  return;
84  bits[longIndex] &= ~(1L << bitIndex);
85  trim();
86  }
87 
88  @Override
89  public void clear(int fromIndex, int toIndex) {
90  if ((fromIndex < 0) || (toIndex < fromIndex))
91  throw new IndexOutOfBoundsException();
92  int i = fromIndex >>> 6;
93  if (i >= bits.length)
94  return; // Ensures that i < _length
95  int j = toIndex >>> 6;
96  if (i == j) {
97  bits[i] &= ((1L << fromIndex) - 1) | (-1L << toIndex);
98  return;
99  }
100  bits[i] &= (1L << fromIndex) - 1;
101  if (j < bits.length) {
102  bits[j] &= -1L << toIndex;
103  }
104  for (int k = i + 1; (k < j) && (k < bits.length); k++) {
105  bits[k] = 0;
106  }
107  trim();
108  }
109 
110  @Override
112  return Equalities.IDENTITY;
113  }
114 
115  @Override
116  public boolean contains(Object index) {
117  return get(((Index)index).intValue());
118  }
119 
120  @Override
121  public void flip(int bitIndex) {
122  int i = bitIndex >> 6;
123  setLength(i + 1);
124  bits[i] ^= 1L << bitIndex;
125  trim();
126  }
127 
128  @Override
129  public void flip(int fromIndex, int toIndex) {
130  if ((fromIndex < 0) || (toIndex < fromIndex))
131  throw new IndexOutOfBoundsException();
132  int i = fromIndex >>> 6;
133  int j = toIndex >>> 6;
134  setLength(j + 1);
135  if (i == j) {
136  bits[i] ^= (-1L << fromIndex) & ((1L << toIndex) - 1);
137  return;
138  }
139  bits[i] ^= -1L << fromIndex;
140  bits[j] ^= (1L << toIndex) - 1;
141  for (int k = i + 1; k < j; k++) {
142  bits[k] ^= -1;
143  }
144  trim();
145  }
146 
147  @Override
148  public boolean get(int bitIndex) {
149  int i = bitIndex >> 6;
150  return (i >= bits.length) ? false : (bits[i] & (1L << bitIndex)) != 0;
151  }
152 
153  @Override
154  public BitSetServiceImpl get(int fromIndex, int toIndex) {
155  if (fromIndex < 0 || fromIndex > toIndex)
156  throw new IndexOutOfBoundsException();
157  BitSetServiceImpl bitSet = new BitSetServiceImpl();
158  int length = MathLib.min(bits.length, (toIndex >>> 6) + 1);
159  bitSet.bits = new long[length];
160  System.arraycopy(bits, 0, bitSet.bits, 0, length);
161  bitSet.clear(0, fromIndex);
162  bitSet.clear(toIndex, length << 6);
163  return bitSet;
164  }
165 
167  @Override
168  public boolean getAndSet(int bitIndex, boolean value) {
169  int i = bitIndex >> 6;
170  if (i >= bits.length) {
171  setLength(i + 1);
172  }
173  boolean previous = (bits[i] & (1L << bitIndex)) != 0;
174  if (value) {
175  bits[i] |= 1L << bitIndex;
176  } else {
177  bits[i] &= ~(1L << bitIndex);
178  }
179  trim();
180  return previous;
181  }
182 
183  @Override
184  public boolean intersects(BitSetService that) {
185  long[] thatBits = that.toLongArray();
186  int i = MathLib.min(this.bits.length, thatBits.length);
187  while (--i >= 0) {
188  if ((bits[i] & thatBits[i]) != 0) return true;
189  }
190  return false;
191  }
192 
193  @Override
194  public Iterator<Index> iterator() {
195  return new BitSetIteratorImpl(this, 0);
196  }
197 
198  @Override
199  public int length() {
200  if (bits.length == 0) return 0;
201  return (bits.length << 6) - MathLib.numberOfLeadingZeros(bits[bits.length -1]);
202  }
203 
204  @Override
205  public int nextClearBit(int fromIndex) {
206  int offset = fromIndex >> 6;
207  long mask = 1L << fromIndex;
208  while (offset < bits.length) {
209  long h = bits[offset];
210  do {
211  if ((h & mask) == 0) { return fromIndex; }
212  mask <<= 1;
213  fromIndex++;
214  } while (mask != 0);
215  mask = 1;
216  offset++;
217  }
218  return fromIndex;
219  }
220 
221  @Override
222  public int nextSetBit(int fromIndex) {
223  int offset = fromIndex >> 6;
224  long mask = 1L << fromIndex;
225  while (offset < bits.length) {
226  long h = bits[offset];
227  do {
228  if ((h & mask) != 0)
229  return fromIndex;
230  mask <<= 1;
231  fromIndex++;
232  } while (mask != 0);
233  mask = 1;
234  offset++;
235  }
236  return -1;
237  }
238 
239  @Override
240  public void or(BitSetService that) {
241  long[] thatBits = (that instanceof BitSetServiceImpl) ? ((BitSetServiceImpl) that).bits
242  : that.toLongArray();
243  if (thatBits.length > this.bits.length) {
244  setLength(thatBits.length);
245  }
246  for (int i = thatBits.length; --i >= 0;) {
247  bits[i] |= thatBits[i];
248  }
249  trim();
250  }
251 
252  @Override
253  public int previousClearBit(int fromIndex) {
254  int offset = fromIndex >> 6;
255  long mask = 1L << fromIndex;
256  while (offset >= 0) {
257  long h = bits[offset];
258  do {
259  if ((h & mask) == 0)
260  return fromIndex;
261  mask >>= 1;
262  fromIndex--;
263  } while (mask != 0);
264  mask = 1L << 63;
265  offset--;
266  }
267  return -1;
268  }
269 
270  @Override
271  public int previousSetBit(int fromIndex) {
272  int offset = fromIndex >> 6;
273  long mask = 1L << fromIndex;
274  while (offset >= 0) {
275  long h = bits[offset];
276  do {
277  if ((h & mask) != 0)
278  return fromIndex;
279  mask >>= 1;
280  fromIndex--;
281  } while (mask != 0);
282  mask = 1L << 63;
283  offset--;
284  }
285  return -1;
286  }
287 
288  @Override
289  public boolean remove(Object index) {
290  return getAndSet(((Index)index).intValue(), false);
291  }
292 
293  @Override
294  public void set(int bitIndex) {
295  int i = bitIndex >> 6;
296  if (i >= bits.length) {
297  setLength(i + 1);
298  }
299  bits[i] |= 1L << bitIndex;
300  }
301 
302  @Override
303  public void set(int bitIndex, boolean value) {
304  if (value) {
305  set(bitIndex);
306  } else {
307  clear(bitIndex);
308  }
309  }
310 
311  @Override
312  public void set(int fromIndex, int toIndex) {
313  int i = fromIndex >>> 6;
314  int j = toIndex >>> 6;
315  setLength(j + 1);
316  if (i == j) {
317  bits[i] |= (-1L << fromIndex) & ((1L << toIndex) - 1);
318  return;
319  }
320  bits[i] |= -1L << fromIndex;
321  bits[j] |= (1L << toIndex) - 1;
322  for (int k = i + 1; k < j; k++) {
323  bits[k] = -1;
324  }
325  }
326 
327  @Override
328  public void set(int fromIndex, int toIndex, boolean value) {
329  if (value) {
330  set(fromIndex, toIndex);
331  } else {
332  clear(fromIndex, toIndex);
333  }
334  }
335 
336  @Override
337  public int size() {
338  return cardinality();
339  }
340 
341  @Override
342  public long[] toLongArray() {
343  return bits;
344  }
345 
346  @Override
347  public void xor(BitSetService that) {
348  long[] thatBits = (that instanceof BitSetServiceImpl) ? ((BitSetServiceImpl) that).bits
349  : that.toLongArray();
350  if (thatBits.length > this.bits.length) {
351  setLength(thatBits.length);
352  }
353  for (int i = thatBits.length; --i >= 0;) {
354  bits[i] ^= thatBits[i];
355  }
356  trim();
357  }
358 
362  private void setLength(int newLength) {
363  long[] tmp = new long[newLength];
364  if (newLength >= bits.length) {
365  System.arraycopy(bits, 0, tmp, 0, bits.length);
366  } else { // Truncates.
367  System.arraycopy(bits, 0, tmp, 0, newLength);
368  }
369  bits = tmp;
370  }
371 
375  private void trim() {
376  int n = bits.length;
377  while ((--n >= 0) && (bits[n] == 0L)) {}
378  if (++n < bits.length) setLength(n);
379  }
380 }
javolution.util.function.Equalities.IDENTITY
static final Equality< Object > IDENTITY
Definition: Equalities.java:40
javolution.util.internal.bitset.BitSetServiceImpl.flip
void flip(int bitIndex)
Definition: BitSetServiceImpl.java:121
javolution.util.internal.bitset.BitSetServiceImpl.serialVersionUID
static final long serialVersionUID
Definition: BitSetServiceImpl.java:26
javolution
javolution.util.internal.bitset.BitSetServiceImpl.flip
void flip(int fromIndex, int toIndex)
Definition: BitSetServiceImpl.java:129
javolution.util.internal
javolution.util.service
Definition: BitSetService.java:9
javolution.util.internal.bitset.BitSetServiceImpl.add
boolean add(Index index)
Definition: BitSetServiceImpl.java:38
javolution.util.internal.bitset.BitSetServiceImpl.contains
boolean contains(Object index)
Definition: BitSetServiceImpl.java:116
javolution.lang.MathLib
Definition: MathLib.java:20
javolution.util.internal.bitset.BitSetServiceImpl.cardinality
int cardinality()
Definition: BitSetServiceImpl.java:66
javolution.util.internal.bitset.BitSetServiceImpl.andNot
void andNot(BitSetService that)
Definition: BitSetServiceImpl.java:56
javolution.util.service.BitSetService.toLongArray
long[] toLongArray()
javolution.util.internal.set
Definition: AtomicSetImpl.java:9
javolution.util.internal.bitset.BitSetServiceImpl.comparator
Equality<? super Index > comparator()
Definition: BitSetServiceImpl.java:111
javolution.util.internal.bitset.BitSetServiceImpl.length
int length()
Definition: BitSetServiceImpl.java:199
javolution.util.internal.set.SetView
Definition: SetView.java:18
javolution.util.internal.bitset.BitSetServiceImpl.clear
void clear()
Definition: BitSetServiceImpl.java:75
javolution.util.internal.bitset.BitSetServiceImpl.iterator
Iterator< Index > iterator()
Definition: BitSetServiceImpl.java:194
javolution.util.internal.bitset.BitSetServiceImpl.size
int size()
Definition: BitSetServiceImpl.java:337
javolution.util.internal.bitset.BitSetIteratorImpl
Definition: BitSetIteratorImpl.java:20
javolution.util.internal.bitset.BitSetServiceImpl.toLongArray
long[] toLongArray()
Definition: BitSetServiceImpl.java:342
javolution.util.function.Equality
Definition: Equality.java:39
javolution.util.internal.bitset.BitSetServiceImpl.nextSetBit
int nextSetBit(int fromIndex)
Definition: BitSetServiceImpl.java:222
javolution.lang
Definition: Configurable.java:9
javolution.util.function.Equalities
Definition: Equalities.java:20
javolution.util.internal.bitset.BitSetServiceImpl.and
void and(BitSetService that)
Definition: BitSetServiceImpl.java:43
javolution.util.internal.bitset.BitSetServiceImpl.previousClearBit
int previousClearBit(int fromIndex)
Definition: BitSetServiceImpl.java:253
javolution.util.internal.bitset.BitSetServiceImpl.xor
void xor(BitSetService that)
Definition: BitSetServiceImpl.java:347
javolution.util.internal.bitset.BitSetServiceImpl.setLength
void setLength(int newLength)
Definition: BitSetServiceImpl.java:362
javolution.lang.MathLib.bitCount
static int bitCount(long longValue)
Definition: MathLib.java:97
javolution.util.service.BitSetService
Definition: BitSetService.java:23
javolution.util.internal.bitset.BitSetServiceImpl.getAndSet
boolean getAndSet(int bitIndex, boolean value)
Definition: BitSetServiceImpl.java:168
javolution.util.Index
Definition: Index.java:44
javolution.util.function
Definition: Consumer.java:9
javolution.util.internal.bitset.BitSetServiceImpl.clear
void clear(int bitIndex)
Definition: BitSetServiceImpl.java:80
javolution.util.internal.bitset.BitSetServiceImpl.trim
void trim()
Definition: BitSetServiceImpl.java:375
javolution.util.Index.intValue
int intValue()
Definition: Index.java:203
javolution.util.internal.bitset.BitSetServiceImpl.BitSetServiceImpl
BitSetServiceImpl()
Definition: BitSetServiceImpl.java:32
javolution.util.internal.bitset.BitSetServiceImpl
Definition: BitSetServiceImpl.java:24
javolution.util.internal.bitset.BitSetServiceImpl.intersects
boolean intersects(BitSetService that)
Definition: BitSetServiceImpl.java:184
javolution.lang.MathLib.numberOfLeadingZeros
static int numberOfLeadingZeros(long longValue)
Definition: MathLib.java:117
javolution.util.internal.bitset.BitSetServiceImpl.clear
void clear(int fromIndex, int toIndex)
Definition: BitSetServiceImpl.java:89
javolution.util.internal.bitset.BitSetServiceImpl.nextClearBit
int nextClearBit(int fromIndex)
Definition: BitSetServiceImpl.java:205
javolution.util.internal.bitset.BitSetServiceImpl.previousSetBit
int previousSetBit(int fromIndex)
Definition: BitSetServiceImpl.java:271
javolution.util.internal.bitset.BitSetServiceImpl.or
void or(BitSetService that)
Definition: BitSetServiceImpl.java:240
javolution.util
Definition: FastBitSet.java:9
javolution.lang.MathLib.min
static int min(int x, int y)
Definition: MathLib.java:1010
javolution.util.internal.bitset.BitSetServiceImpl.bits
long[] bits
Definition: BitSetServiceImpl.java:29