/**
* Copyright 2014 Sunny Gleason and original author or authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.kazuki.v0.internal.v2schema.util;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.List;
import com.google.common.collect.ImmutableList;
/**
* Utility methods for converting BitSet instances to/from Long array representation. For
* compactness, BitSet instances with fewer than 64 bits are represented as a single long (instead
* of an array of 1 or zero elements).
*/
public class BitSetUtil {
public static Object pack(BitSet bitSet) {
List<Long> values = new ArrayList<Long>();
long value = 0L;
int j = 0;
for (int i = 0; i < bitSet.size();) {
if (bitSet.get(i)) {
value |= (1L << j);
}
i += 1;
j += 1;
if (j == 64) {
j = 0;
values.add(value);
value = 0L;
}
}
if (value != 0) {
values.add(value);
}
return (values.size() > 1) ? values : values.get(0);
}
@SuppressWarnings("unchecked")
public static BitSet unpack(Object representation) {
List<Long> values = null;
if (representation instanceof Number) {
values = ImmutableList.<Long>of(((Number) representation).longValue());
} else {
values = (List<Long>) representation;
}
BitSet bitSet = new BitSet();
int i = 0;
for (Long value : values) {
long v = value.longValue();
if (v != 0) {
for (int j = 0; j < 64; j++) {
if ((v & (1L << j)) != 0) {
bitSet.set((i * 64) + j);
}
}
}
i += 1;
}
return bitSet;
}
}