| 278 | */ |
| 279 | |
| 280 | __normal_call void_type set_alloc ( |
| 281 | size_type _new_alloc |
| 282 | ) |
| 283 | { |
| 284 | size_type _cur_count = count(); |
| 285 | size_type _cur_alloc = alloc(); |
| 286 | |
| 287 | size_type _cur_block = +0; |
| 288 | size_type _new_block = +0; |
| 289 | size_type _end_block = +0; |
| 290 | size_type _end_shift = +0; |
| 291 | |
| 292 | size_type _siz_block = _size ; |
| 293 | size_type _nil_block = +0 ; |
| 294 | |
| 295 | if (_new_alloc < _cur_count ) |
| 296 | { |
| 297 | /*--------------- _destruct un-needed range first */ |
| 298 | set_count(_new_alloc, |
| 299 | __cont::loose_alloc) ; |
| 300 | } |
| 301 | |
| 302 | if (_cur_alloc!=+0) |
| 303 | { |
| 304 | /*-------------- calc. block-wise storage offsets */ |
| 305 | _cur_block = |
| 306 | (_cur_alloc - 1) / _size + 0 ; |
| 307 | } |
| 308 | if (_new_alloc!=+0) |
| 309 | { |
| 310 | _new_block = |
| 311 | (_new_alloc - 1) / _size + 0 ; |
| 312 | _end_block = |
| 313 | (_new_alloc - 1) / _size + 1 ; |
| 314 | _end_shift = |
| 315 | (_new_alloc - 1) % _size + 1 ; |
| 316 | } |
| 317 | |
| 318 | if (_new_alloc < _cur_alloc ) |
| 319 | { |
| 320 | /*--------------- _pop old blocks and realloc end */ |
| 321 | size_type _pos_block ; |
| 322 | for(_pos_block=_cur_block; |
| 323 | _pos_block>_new_block; |
| 324 | --_pos_block ) |
| 325 | { |
| 326 | this->_block [_pos_block]. |
| 327 | set_alloc(_nil_block); |
| 328 | } |
| 329 | this->_block [_new_block]. |
| 330 | set_alloc(_end_shift); |
| 331 | |
| 332 | this->_block.set_count ( |
| 333 | _end_block, __cont::loose_alloc) ; |
| 334 | |
| 335 | this->_alloc =_new_alloc ; |
| 336 | } |
| 337 | else |