342 int target = MAX2(1, (int) (level * num() / 100));
343 int cnt = 0;
344 for (int mag = 0; mag < MagBuckets; mag++) {
345 if (_hdr[mag] != NULL) {
346 for (int val = 0; val < ValBuckets; val++) {
347 cnt += _hdr[mag][val];
348 if (cnt >= target) {
349 return pow(10.0, MagMinimum + mag) * val / ValBuckets;
350 }
351 }
352 }
353 }
354 return maximum();
355 }
356
357 BinaryMagnitudeSeq::BinaryMagnitudeSeq() {
358 _mags = NEW_C_HEAP_ARRAY(jlong, BitsPerJavaLong, mtInternal);
359 for (int c = 0; c < BitsPerJavaLong; c++) {
360 _mags[c] = 0;
361 }
362 }
363
364 BinaryMagnitudeSeq::~BinaryMagnitudeSeq() {
365 FREE_C_HEAP_ARRAY(size_t, _mags, mtInternal);
366 }
367
368 void BinaryMagnitudeSeq::add(size_t val) {
369 int mag = log2_intptr(val) + 1;
370
371 // Defensively saturate for product bits:
372 if (mag < 0) {
373 assert (false, err_msg("bucket index (%d) underflow for value (" SIZE_FORMAT ")", mag, val));
374 mag = 0;
375 }
376
377 if (mag >= BitsPerJavaLong) {
378 assert (false, err_msg("bucket index (%d) overflow for value (" SIZE_FORMAT ")", mag, val));
379 mag = BitsPerJavaLong - 1;
380 }
381
382 Atomic::add(1, &_mags[mag]);
383 }
384
385 size_t BinaryMagnitudeSeq::level(int level) const {
386 if (0 <= level && level < BitsPerJavaLong) {
387 return _mags[level];
388 } else {
389 return 0;
390 }
391 }
392
393 size_t BinaryMagnitudeSeq::num() const {
394 int r = 0;
395 for (int c = 0; c < BitsPerJavaLong; c++) {
396 r += _mags[c];
397 }
398 return r;
399 }
400
401 int BinaryMagnitudeSeq::min_level() const {
402 for (int c = 0; c < BitsPerJavaLong; c++) {
403 if (_mags[c] != 0) {
404 return c;
405 }
406 }
407 return BitsPerJavaLong - 1;
408 }
409
410 int BinaryMagnitudeSeq::max_level() const {
411 for (int c = BitsPerJavaLong - 1; c > 0; c--) {
412 if (_mags[c] != 0) {
413 return c;
414 }
415 }
416 return 0;
417 }
418
|
342 int target = MAX2(1, (int) (level * num() / 100));
343 int cnt = 0;
344 for (int mag = 0; mag < MagBuckets; mag++) {
345 if (_hdr[mag] != NULL) {
346 for (int val = 0; val < ValBuckets; val++) {
347 cnt += _hdr[mag][val];
348 if (cnt >= target) {
349 return pow(10.0, MagMinimum + mag) * val / ValBuckets;
350 }
351 }
352 }
353 }
354 return maximum();
355 }
356
357 BinaryMagnitudeSeq::BinaryMagnitudeSeq() {
358 _mags = NEW_C_HEAP_ARRAY(jlong, BitsPerJavaLong, mtInternal);
359 for (int c = 0; c < BitsPerJavaLong; c++) {
360 _mags[c] = 0;
361 }
362 _sum = 0;
363 }
364
365 BinaryMagnitudeSeq::~BinaryMagnitudeSeq() {
366 FREE_C_HEAP_ARRAY(size_t, _mags, mtInternal);
367 }
368
369 void BinaryMagnitudeSeq::add(size_t val) {
370 Atomic::add(val, &_sum);
371
372 int mag = log2_intptr(val) + 1;
373
374 // Defensively saturate for product bits:
375 if (mag < 0) {
376 assert (false, err_msg("bucket index (%d) underflow for value (" SIZE_FORMAT ")", mag, val));
377 mag = 0;
378 }
379
380 if (mag >= BitsPerJavaLong) {
381 assert (false, err_msg("bucket index (%d) overflow for value (" SIZE_FORMAT ")", mag, val));
382 mag = BitsPerJavaLong - 1;
383 }
384
385 Atomic::add(1, &_mags[mag]);
386 }
387
388 size_t BinaryMagnitudeSeq::level(int level) const {
389 if (0 <= level && level < BitsPerJavaLong) {
390 return _mags[level];
391 } else {
392 return 0;
393 }
394 }
395
396 size_t BinaryMagnitudeSeq::num() const {
397 int r = 0;
398 for (int c = 0; c < BitsPerJavaLong; c++) {
399 r += _mags[c];
400 }
401 return r;
402 }
403
404 size_t BinaryMagnitudeSeq::sum() const {
405 return _sum;
406 }
407
408 int BinaryMagnitudeSeq::min_level() const {
409 for (int c = 0; c < BitsPerJavaLong; c++) {
410 if (_mags[c] != 0) {
411 return c;
412 }
413 }
414 return BitsPerJavaLong - 1;
415 }
416
417 int BinaryMagnitudeSeq::max_level() const {
418 for (int c = BitsPerJavaLong - 1; c > 0; c--) {
419 if (_mags[c] != 0) {
420 return c;
421 }
422 }
423 return 0;
424 }
425
|