115 } 116 } 117 } 118 } 119 return maximum(); 120 } 121 122 BinaryMagnitudeSeq::BinaryMagnitudeSeq() { 123 _mags = NEW_C_HEAP_ARRAY(size_t, BitsPerSize_t, mtInternal); 124 for (int c = 0; c < BitsPerSize_t; c++) { 125 _mags[c] = 0; 126 } 127 _sum = 0; 128 } 129 130 BinaryMagnitudeSeq::~BinaryMagnitudeSeq() { 131 FREE_C_HEAP_ARRAY(size_t, _mags); 132 } 133 134 void BinaryMagnitudeSeq::add(size_t val) { 135 Atomic::add(val, &_sum); 136 137 int mag = log2_intptr(val) + 1; 138 139 // Defensively saturate for product bits: 140 if (mag < 0) { 141 assert (false, "bucket index (%d) underflow for value (" SIZE_FORMAT ")", mag, val); 142 mag = 0; 143 } 144 145 if (mag >= BitsPerSize_t) { 146 assert (false, "bucket index (%d) overflow for value (" SIZE_FORMAT ")", mag, val); 147 mag = BitsPerSize_t - 1; 148 } 149 150 Atomic::add((size_t)1, &_mags[mag]); 151 } 152 153 size_t BinaryMagnitudeSeq::level(int level) const { 154 if (0 <= level && level < BitsPerSize_t) { 155 return _mags[level]; 156 } else { 157 return 0; 158 } 159 } 160 161 size_t BinaryMagnitudeSeq::num() const { 162 size_t r = 0; 163 for (int c = 0; c < BitsPerSize_t; c++) { 164 r += _mags[c]; 165 } 166 return r; 167 } 168 169 size_t BinaryMagnitudeSeq::sum() const { 170 return _sum; | 115 } 116 } 117 } 118 } 119 return maximum(); 120 } 121 122 BinaryMagnitudeSeq::BinaryMagnitudeSeq() { 123 _mags = NEW_C_HEAP_ARRAY(size_t, BitsPerSize_t, mtInternal); 124 for (int c = 0; c < BitsPerSize_t; c++) { 125 _mags[c] = 0; 126 } 127 _sum = 0; 128 } 129 130 BinaryMagnitudeSeq::~BinaryMagnitudeSeq() { 131 FREE_C_HEAP_ARRAY(size_t, _mags); 132 } 133 134 void BinaryMagnitudeSeq::add(size_t val) { 135 Atomic::add(&_sum, val); 136 137 int mag = log2_intptr(val) + 1; 138 139 // Defensively saturate for product bits: 140 if (mag < 0) { 141 assert (false, "bucket index (%d) underflow for value (" SIZE_FORMAT ")", mag, val); 142 mag = 0; 143 } 144 145 if (mag >= BitsPerSize_t) { 146 assert (false, "bucket index (%d) overflow for value (" SIZE_FORMAT ")", mag, val); 147 mag = BitsPerSize_t - 1; 148 } 149 150 Atomic::add(&_mags[mag], (size_t)1); 151 } 152 153 size_t BinaryMagnitudeSeq::level(int level) const { 154 if (0 <= level && level < BitsPerSize_t) { 155 return _mags[level]; 156 } else { 157 return 0; 158 } 159 } 160 161 size_t BinaryMagnitudeSeq::num() const { 162 size_t r = 0; 163 for (int c = 0; c < BitsPerSize_t; c++) { 164 r += _mags[c]; 165 } 166 return r; 167 } 168 169 size_t BinaryMagnitudeSeq::sum() const { 170 return _sum; |