1
0
forked from 0ad/0ad
0ad/source/tools/rmgen/rangeop.cpp

49 lines
724 B
C++

#include "stdafx.h"
#include "rangeop.h"
RangeOp::RangeOp(int size) {
nn = 1;
while(nn < size) {
nn *= 2;
}
vals = new int[2*nn];
memset(vals, 0, 2*nn*sizeof(int));
}
RangeOp::~RangeOp() {
delete[] vals;
}
int RangeOp::get(int pos) {
return vals[nn + pos];
}
void RangeOp::set(int pos, int amt) {
add(pos, amt-get(pos));
}
void RangeOp::add(int pos, int amt) {
for(int s=nn; s>0; s/=2) {
vals[s + pos] += amt;
pos /= 2;
}
}
int RangeOp::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;
}