Remove several elements from the end of sequence: */
| 1514 | |
| 1515 | /* Remove several elements from the end of sequence: */ |
| 1516 | CV_IMPL void |
| 1517 | cvSeqPopMulti( CvSeq *seq, void *_elements, int count, int front ) |
| 1518 | { |
| 1519 | char *elements = (char *) _elements; |
| 1520 | |
| 1521 | if( !seq ) |
| 1522 | CV_Error( CV_StsNullPtr, "NULL sequence pointer" ); |
| 1523 | if( count < 0 ) |
| 1524 | CV_Error( CV_StsBadSize, "number of removed elements is negative" ); |
| 1525 | |
| 1526 | count = MIN( count, seq->total ); |
| 1527 | |
| 1528 | if( !front ) |
| 1529 | { |
| 1530 | if( elements ) |
| 1531 | elements += count * seq->elem_size; |
| 1532 | |
| 1533 | while( count > 0 ) |
| 1534 | { |
| 1535 | int delta = seq->first->prev->count; |
| 1536 | |
| 1537 | delta = MIN( delta, count ); |
| 1538 | assert( delta > 0 ); |
| 1539 | |
| 1540 | seq->first->prev->count -= delta; |
| 1541 | seq->total -= delta; |
| 1542 | count -= delta; |
| 1543 | delta *= seq->elem_size; |
| 1544 | seq->ptr -= delta; |
| 1545 | |
| 1546 | if( elements ) |
| 1547 | { |
| 1548 | elements -= delta; |
| 1549 | memcpy( elements, seq->ptr, delta ); |
| 1550 | } |
| 1551 | |
| 1552 | if( seq->first->prev->count == 0 ) |
| 1553 | icvFreeSeqBlock( seq, 0 ); |
| 1554 | } |
| 1555 | } |
| 1556 | else |
| 1557 | { |
| 1558 | while( count > 0 ) |
| 1559 | { |
| 1560 | int delta = seq->first->count; |
| 1561 | |
| 1562 | delta = MIN( delta, count ); |
| 1563 | assert( delta > 0 ); |
| 1564 | |
| 1565 | seq->first->count -= delta; |
| 1566 | seq->total -= delta; |
| 1567 | count -= delta; |
| 1568 | seq->first->start_index += delta; |
| 1569 | delta *= seq->elem_size; |
| 1570 | |
| 1571 | if( elements ) |
| 1572 | { |
| 1573 | memcpy( elements, seq->first->data, delta ); |
no test coverage detected