Changeset 6507


Ignore:
Timestamp:
Aug 13, 2008, 7:25:08 PM (13 years ago)
Author:
charles
Message:

(libT) tr_bitfieldRemRange speedup. (muks)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/utils.c

    r6480 r6507  
    781781}
    782782
    783 #if 0
    784 static int
    785 find_top_bit( uint8_t val )
    786 {
    787     int pos = 0;
    788     if ( val & 0xF0U ) pos |= 4, val >>= 4;
    789     if ( val & 0xCU )  pos |= 2, val >>= 2;
    790     if ( val & 0x2 )   pos |= 1;
    791     return 7 - pos;
    792 }
    793 
    794 int
    795 tr_bitfieldFindTrue( const tr_bitfield  * bitfield,
    796                      size_t               startBit,
    797                      size_t             * setmePos )
    798 {
    799     if( bitfield && bitfield->bits && startBit < bitfield->bitCount )
    800     {
    801         const uint8_t * b   = bitfield->bits + startBit/8;
    802         const uint8_t * end = bitfield->bits + bitfield->byteCount;
    803 
    804         /* If first byte already contains a set bit after startBit*/
    805         if( *b & ( 0xff >> (startBit&7) ) ) {
    806             *setmePos  = 8 * ( b - bitfield->bits );
    807             *setmePos += find_top_bit( *b & ( 0xff >> (startBit&7) ) );
    808             return 1;
    809         }
    810 
    811         /* Test bitfield for first non zero byte */
    812         ++b;
    813         while( (b < end) && !*b )
    814             ++b;
    815 
    816         /* If we hit the end of our bitfield, no set bit was found */
    817         if( b == end )
    818             return 0;
    819 
    820         /* New bitposition is byteoff*8 */
    821         *setmePos = 8 * ( b - bitfield->bits ) + find_top_bit( *b );
    822 
    823         return 1;
    824     }
    825 
    826     return 0;
    827 }
    828 #endif
    829 
    830783int
    831784tr_bitfieldAdd( tr_bitfield  * bitfield, size_t nth )
     
    873826                      size_t         end )
    874827{
    875     int err = 0;
    876     size_t i;
    877     for( i=begin; i<end; ++i )
    878         if(( err = tr_bitfieldRem( b, i )))
    879             break;
    880     return err;
     828    size_t sb, eb;
     829    unsigned char sm, em;
     830
     831    if( ( end >= b->bitCount ) || ( begin > end ) )
     832        return -1;
     833
     834    sb = begin >> 3;
     835    sm = 0xff << ( 8 - ( begin & 7 ) );
     836    eb = end >> 3;
     837    em = ~( 0xff << ( 8 - ( end & 7 ) ) );
     838
     839    if ( sb == eb ) {
     840        b->bits[sb] &= ( sm | em );
     841    } else {
     842        b->bits[sb] &= sm;
     843        b->bits[eb] &= em;
     844        if( ++sb < eb )
     845            memset (b->bits + sb, 0, eb - sb);
     846    }
     847
     848    return 0;
     849
    881850}
    882851
Note: See TracChangeset for help on using the changeset viewer.