/*
* Copyright 2012 Takao Nakaguchi
*
* 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 org.trie4j.louds.bvtree;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import org.trie4j.bv.BitVector01Divider;
import org.trie4j.bv.BytesSuccinctBitVector;
import org.trie4j.bv.BytesRank0OnlySuccinctBitVector;
import org.trie4j.bv.SuccinctBitVector;
import org.trie4j.util.Range;
public class LOUDSPPBvTree
implements Externalizable, BvTree{
public LOUDSPPBvTree() {
this(0);
}
public LOUDSPPBvTree(int initialNodeCapacity) {
r0 = new BytesRank0OnlySuccinctBitVector(initialNodeCapacity);
r1 = new BytesSuccinctBitVector(initialNodeCapacity);
divider = new BitVector01Divider(r0, r1);
}
/**
*
* @param divider
* @param r0 SBV for r0. Only rank0 method of this sbv will be invoked.
* @param r1
*/
public LOUDSPPBvTree(BitVector01Divider divider,
SuccinctBitVector r0, SuccinctBitVector r1) {
this.divider = divider;
this.r0 = r0;
this.r1 = r1;
divider.setVectors(r0, r1);
}
public LOUDSPPBvTree(
SuccinctBitVector r0, SuccinctBitVector r1) {
this.divider = new BitVector01Divider();
this.r0 = r0;
this.r1 = r1;
divider.setVectors(r0, r1);
}
public BitVector01Divider getDivider() {
return divider;
}
public SuccinctBitVector getR0() {
return r0;
}
public SuccinctBitVector getR1() {
return r1;
}
@Override
public String toString() {
return "r0: " + r0.toString() + " r1: " + r1.toString();
}
@Override
public void appendChild() {
divider.append1();
}
@Override
public void appendSelf() {
divider.append0();
}
@Override
public void getChildNodeIds(int selfNodeId, Range range) {
if(r0.isZero(selfNodeId)){
int start = r1.select0(r0.rank0(selfNodeId)) + 1;
range.set(start, r1.next0(start) + 1);
return;
}
range.set(-1, -1);
}
@Override
public void trimToSize() {
r0.trimToSize();
r1.trimToSize();
}
@Override
public void readExternal(ObjectInput in)
throws ClassNotFoundException, IOException {
divider.readExternal(in);
r0 = (SuccinctBitVector)in.readObject();
r1 = (SuccinctBitVector)in.readObject();
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
divider.writeExternal(out);
out.writeObject(r0);
out.writeObject(r1);
}
private BitVector01Divider divider;
private SuccinctBitVector r0;
private SuccinctBitVector r1;
}