/*
* 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.test;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.trie4j.bv.SuccinctBitVector;
public class MonitoredSuccinctBitVector implements SuccinctBitVector{
public MonitoredSuccinctBitVector(SuccinctBitVector orig) {
this.orig = orig;
}
public SuccinctBitVector getOriginal() {
return orig;
}
public void resetCounts(){
select0Count = 0;
select0Time = 0;
select0MinTime = Long.MAX_VALUE;
select0MaxTime = Long.MIN_VALUE;
select1Count = 0;
select1Time = 0;
next0Count = 0;
next0Time = 0;
rank0Count = 0;
rank0Time = 0;
rank1Count = 0;
rank1Time = 0;
}
public int getNext0Count() {
return next0Count;
}
public long getNext0Time() {
return next0Time;
}
public int getSelect0Count() {
return select0Count;
}
public long getSelect0Time() {
return select0Time;
}
public long getSelect0MaxTime() {
return select0MaxTime;
}
public long getSelect0MinTime() {
return select0MinTime;
}
public Collection<Long> getSelect0Times() {
return select0Times;
}
public Map<Long, Integer> getSelect0TimesMap() {
return select0TimesMap;
}
public int getSelect1Count() {
return select1Count;
}
public long getSelect1Time() {
return select1Time;
}
public int getRank0Count() {
return rank0Count;
}
public long getRank0Time() {
return rank0Time;
}
public int getRank1Count() {
return rank1Count;
}
public long getRank1Time() {
return rank1Time;
}
public int getAppend0Count() {
return append0Count;
}
public long getAppend0Time() {
return append0Time;
}
public int getAppend1Count() {
return append1Count;
}
public long getAppend1Time() {
return append1Time;
}
@Override
public int select0(int count) {
select0Count++;
t.reset();
try{
return orig.select0(count);
} finally{
long n = t.lapNanos();
select0Time += n;
select0MaxTime = Math.max(select0MaxTime, n);
select0MinTime = Math.min(select0MinTime, n);
if(select0Count % 500 == 0){
select0Times.add(n);
}
Integer i = select0TimesMap.get(n);
if(i == null) i = 1;
else i = i + 1;
select0TimesMap.put(n, i);
}
}
@Override
public int select1(int count) {
select1Count++;
t.reset();
try{
return orig.select1(count);
} finally{
select1Time += t.lapNanos();
}
}
@Override
public int next0(int pos) {
next0Count++;
t.reset();
try{
return orig.next0(pos);
} finally{
next0Time += t.lapNanos();
}
}
@Override
public int rank0(int pos) {
rank0Count++;
t.reset();
try{
return orig.rank0(pos);
} finally{
rank0Time += t.lapNanos();
}
}
@Override
public int rank1(int pos) {
rank1Count++;
t.reset();
try{
return orig.rank1(pos);
} finally{
rank1Time += t.lapNanos();
}
}
@Override
public void append0() {
append0Count++;
t.reset();
try{
orig.append0();
} finally{
append0Time += t.lapNanos();
}
}
@Override
public void append1() {
append1Count++;
t.reset();
try{
orig.append1();
} finally{
append1Time += t.lapNanos();
}
}
@Override
public boolean get(int pos) {
return orig.get(pos);
}
@Override
public boolean isOne(int pos) {
return orig.isOne(pos);
}
@Override
public boolean isZero(int pos) {
return orig.isZero(pos);
}
@Override
public int size() {
return orig.size();
}
@Override
public void trimToSize() {
orig.trimToSize();
}
private SuccinctBitVector orig;
private LapTimer t = new LapTimer();
private int select0Count;
private long select0Time;
private long select0MaxTime;
private long select0MinTime;
private List<Long> select0Times = new ArrayList<Long>();
private Map<Long, Integer> select0TimesMap = new TreeMap<Long, Integer>();
private int select1Count;
private long select1Time;
private int next0Count;
private long next0Time;
private int rank0Count;
private long rank0Time;
private int rank1Count;
private long rank1Time;
private int append0Count;
private long append0Time;
private int append1Count;
private long append1Time;
}