1
0
forked from 0ad/0ad
0ad/source/tools/rmgen/rangecount.cpp
2005-09-03 21:53:07 +00:00

49 lines
799 B
C++

#include "stdafx.h"
#include "rangecount.h"
RangeCount::RangeCount(int size) {
nn = 1;
while(nn < size) {
nn *= 2;
}
vals = new int[2*nn];
memset(vals, 0, 2*nn*sizeof(int));
}
RangeCount::~RangeCount() {
delete[] vals;
}
int RangeCount::get(int pos) {
return vals[nn + pos];
}
void RangeCount::set(int pos, int amt) {
add(pos, amt-get(pos));
}
void RangeCount::add(int pos, int amt) {
for(int s=nn; s>0; s/=2) {
vals[s + pos] += amt;
pos /= 2;
}
}
int RangeCount::get(int start, int end) {
int ret = 0;
int i;
for(i=1; start+i<=end; i*=2) {
if(start & i) {
ret += vals[nn/i + start/i];
start += i;
}
}
while(i) {
if(start+i <= end) {
ret += vals[nn/i + start/i];
start += i;
}
i /= 2;
}
return ret;
}