Add several elements to the beginning or end of a sequence: */
| 1445 | |
| 1446 | /* Add several elements to the beginning or end of a sequence: */ |
| 1447 | CV_IMPL void |
| 1448 | cvSeqPushMulti( CvSeq *seq, const void *_elements, int count, int front ) |
| 1449 | { |
| 1450 | char *elements = (char *) _elements; |
| 1451 | |
| 1452 | if( !seq ) |
| 1453 | CV_Error( CV_StsNullPtr, "NULL sequence pointer" ); |
| 1454 | if( count < 0 ) |
| 1455 | CV_Error( CV_StsBadSize, "number of removed elements is negative" ); |
| 1456 | |
| 1457 | int elem_size = seq->elem_size; |
| 1458 | |
| 1459 | if( !front ) |
| 1460 | { |
| 1461 | while( count > 0 ) |
| 1462 | { |
| 1463 | int delta = (int)((seq->block_max - seq->ptr) / elem_size); |
| 1464 | |
| 1465 | delta = MIN( delta, count ); |
| 1466 | if( delta > 0 ) |
| 1467 | { |
| 1468 | seq->first->prev->count += delta; |
| 1469 | seq->total += delta; |
| 1470 | count -= delta; |
| 1471 | delta *= elem_size; |
| 1472 | if( elements ) |
| 1473 | { |
| 1474 | memcpy( seq->ptr, elements, delta ); |
| 1475 | elements += delta; |
| 1476 | } |
| 1477 | seq->ptr += delta; |
| 1478 | } |
| 1479 | |
| 1480 | if( count > 0 ) |
| 1481 | icvGrowSeq( seq, 0 ); |
| 1482 | } |
| 1483 | } |
| 1484 | else |
| 1485 | { |
| 1486 | CvSeqBlock* block = seq->first; |
| 1487 | |
| 1488 | while( count > 0 ) |
| 1489 | { |
| 1490 | int delta; |
| 1491 | |
| 1492 | if( !block || block->start_index == 0 ) |
| 1493 | { |
| 1494 | icvGrowSeq( seq, 1 ); |
| 1495 | |
| 1496 | block = seq->first; |
| 1497 | assert( block->start_index > 0 ); |
| 1498 | } |
| 1499 | |
| 1500 | delta = MIN( block->start_index, count ); |
| 1501 | count -= delta; |
| 1502 | block->start_index -= delta; |
| 1503 | block->count += delta; |
| 1504 | seq->total += delta; |
no test coverage detected