Revision f2060de1
Added by Leszek Koltunski 12 months ago
src/main/java/org/distorted/objectlib/tablebases/PruningTable.java | ||
---|---|---|
21 | 21 |
private int mBucketBytes; |
22 | 22 |
private int mNumBuckets; |
23 | 23 |
private int mLevel; |
24 |
private int[] mBucketOffsets; |
|
24 | 25 |
|
25 | 26 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
26 | 27 |
|
... | ... | |
60 | 61 |
|
61 | 62 |
private int getBucketOffset(int bucket) |
62 | 63 |
{ |
63 |
if( bucket>=mNumBuckets ) return mData.length; |
|
64 |
if( mBucketOffsets[bucket]==0 ) |
|
65 |
{ |
|
66 |
if( bucket>=mNumBuckets ) mBucketOffsets[bucket] = mData.length; |
|
67 |
else |
|
68 |
{ |
|
69 |
int ret = 0; |
|
70 |
int start = HEADER_SIZE + bucket*mBucketBytes; |
|
64 | 71 |
|
65 |
int ret = 0; |
|
66 |
int start = HEADER_SIZE + bucket*mBucketBytes; |
|
72 |
for(int i=0; i<mBucketBytes; i++) |
|
73 |
{ |
|
74 |
ret<<=8; |
|
75 |
ret += ( ((int)(mData[start+i]))&0xff); |
|
76 |
} |
|
67 | 77 |
|
68 |
for(int i=0; i<mBucketBytes; i++) |
|
69 |
{ |
|
70 |
ret<<=8; |
|
71 |
ret += ( ((int)(mData[start+i]))&0xff); |
|
78 |
mBucketOffsets[bucket] = HEADER_SIZE+mNumBuckets*mBucketBytes+ret; |
|
79 |
} |
|
72 | 80 |
} |
73 | 81 |
|
74 |
return HEADER_SIZE+mNumBuckets*mBucketBytes+ret;
|
|
82 |
return mBucketOffsets[bucket];
|
|
75 | 83 |
} |
76 | 84 |
|
77 | 85 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
235 | 243 |
mNumBuckets = (size+entrySize-1)/entrySize; |
236 | 244 |
int[] bucket = new int[mNumBuckets]; |
237 | 245 |
|
246 |
mBucketOffsets = new int[mNumBuckets+1]; |
|
247 |
|
|
238 | 248 |
for(int i=0; i<size; i++) |
239 | 249 |
if( table.retrieveUnpacked(i)==level ) |
240 | 250 |
{ |
... | ... | |
309 | 319 |
mBucketBytes = ((int)mData[1])&0xff; |
310 | 320 |
mNumBits = ((int)mData[2])&0xff; |
311 | 321 |
mNumBuckets =((((int)mData[3])&0xff)<<16) + ((((int)mData[4])&0xff)<<8) + (((int)mData[5])&0xff); |
322 |
|
|
323 |
mBucketOffsets = new int[mNumBuckets+1]; |
|
312 | 324 |
} |
313 | 325 |
|
314 | 326 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
343 | 355 |
|
344 | 356 |
int lower = 0; |
345 | 357 |
int upper = numEntriesInBucket-1; |
358 |
int rem = (bucket<<mNumBits); |
|
346 | 359 |
|
347 | 360 |
while( upper>=lower ) |
348 | 361 |
{ |
349 | 362 |
int mid = (lower+upper)/2; |
350 |
int value = retrieveData(offset1,mid); |
|
351 |
|
|
352 |
value += (bucket<<mNumBits); |
|
363 |
int value = retrieveData(offset1,mid) + rem; |
|
353 | 364 |
if( value==number ) return true; |
354 |
|
|
355 | 365 |
if( value>number ) upper = mid-1; |
356 | 366 |
else lower = mid+1; |
357 | 367 |
} |
Also available in: Unified diff
speedup in PruningTable