@ -206,18 +206,14 @@ class CompareTxMemPoolEntryByDescendantScore
public :
public :
bool operator ( ) ( const CTxMemPoolEntry & a , const CTxMemPoolEntry & b ) const
bool operator ( ) ( const CTxMemPoolEntry & a , const CTxMemPoolEntry & b ) const
{
{
bool fUseADescendants = UseDescendantScore ( a ) ;
double a_mod_fee , a_size , b_mod_fee , b_size ;
bool fUseBDescendants = UseDescendantScore ( b ) ;
double aModFee = fUseADescendants ? a . GetModFeesWithDescendants ( ) : a . GetModifiedFee ( ) ;
GetModFeeAndSize ( a , a_mod_fee , a_size ) ;
double aSize = fUseADescendants ? a . GetSizeWithDescendants ( ) : a . GetTxSize ( ) ;
GetModFeeAndSize ( b , b_mod_fee , b_size ) ;
double bModFee = fUseBDescendants ? b . GetModFeesWithDescendants ( ) : b . GetModifiedFee ( ) ;
double bSize = fUseBDescendants ? b . GetSizeWithDescendants ( ) : b . GetTxSize ( ) ;
// Avoid division by rewriting (a/b > c/d) as (a*d > c*b).
// Avoid division by rewriting (a/b > c/d) as (a*d > c*b).
double f1 = aModFee * bS ize ;
double f1 = a_mod_fee * b_size ;
double f2 = aSize * bModF ee ;
double f2 = a_size * b_mod_f ee ;
if ( f1 = = f2 ) {
if ( f1 = = f2 ) {
return a . GetTime ( ) > = b . GetTime ( ) ;
return a . GetTime ( ) > = b . GetTime ( ) ;
@ -225,12 +221,21 @@ public:
return f1 < f2 ;
return f1 < f2 ;
}
}
// Calculate which score to use for an entry (avoiding division) .
// Return the fee/size we're using for sorting this entry .
bool UseDescendantScor e( const CTxMemPoolEntry & a ) const
void GetModFeeAndSiz e( const CTxMemPoolEntry & a , double & mod_fee , double & size ) const
{
{
// Compare feerate with descendants to feerate of the transaction, and
// return the fee/size for the max.
double f1 = ( double ) a . GetModifiedFee ( ) * a . GetSizeWithDescendants ( ) ;
double f1 = ( double ) a . GetModifiedFee ( ) * a . GetSizeWithDescendants ( ) ;
double f2 = ( double ) a . GetModFeesWithDescendants ( ) * a . GetTxSize ( ) ;
double f2 = ( double ) a . GetModFeesWithDescendants ( ) * a . GetTxSize ( ) ;
return f2 > f1 ;
if ( f2 > f1 ) {
mod_fee = a . GetModFeesWithDescendants ( ) ;
size = a . GetSizeWithDescendants ( ) ;
} else {
mod_fee = a . GetModifiedFee ( ) ;
size = a . GetTxSize ( ) ;
}
}
}
} ;
} ;
@ -261,27 +266,48 @@ public:
}
}
} ;
} ;
/** \class CompareTxMemPoolEntryByAncestorScore
*
* Sort an entry by min ( score / size of entry ' s tx , score / size with all ancestors ) .
*/
class CompareTxMemPoolEntryByAncestorFee
class CompareTxMemPoolEntryByAncestorFee
{
{
public :
public :
bool operator ( ) ( const CTxMemPoolEntry & a , const CTxMemPoolEntry & b ) const
template < typename T >
bool operator ( ) ( const T & a , const T & b ) const
{
{
double aFees = a . GetModFeesWithAncestors ( ) ;
double a_mod_fee , a_size , b_mod_fee , b_size ;
double aSize = a . GetSizeWithAncestors ( ) ;
double bFees = b . GetModFeesWithAncestors ( ) ;
GetModFeeAndSize ( a , a_mod_fee , a_size ) ;
double bSize = b . GetSizeWithAncestors ( ) ;
GetModFeeAndSize ( b , b_mod_fee , b_size ) ;
// Avoid division by rewriting (a/b > c/d) as (a*d > c*b).
// Avoid division by rewriting (a/b > c/d) as (a*d > c*b).
double f1 = aFees * bS ize ;
double f1 = a_mod_fee * b_s ize ;
double f2 = aSize * bFees ;
double f2 = a_size * b_mod_fee ;
if ( f1 = = f2 ) {
if ( f1 = = f2 ) {
return a . GetTx ( ) . GetHash ( ) < b . GetTx ( ) . GetHash ( ) ;
return a . GetTx ( ) . GetHash ( ) < b . GetTx ( ) . GetHash ( ) ;
}
}
return f1 > f2 ;
return f1 > f2 ;
}
}
// Return the fee/size we're using for sorting this entry.
template < typename T >
void GetModFeeAndSize ( const T & a , double & mod_fee , double & size ) const
{
// Compare feerate with ancestors to feerate of the transaction, and
// return the fee/size for the min.
double f1 = ( double ) a . GetModifiedFee ( ) * a . GetSizeWithAncestors ( ) ;
double f2 = ( double ) a . GetModFeesWithAncestors ( ) * a . GetTxSize ( ) ;
if ( f1 > f2 ) {
mod_fee = a . GetModFeesWithAncestors ( ) ;
size = a . GetSizeWithAncestors ( ) ;
} else {
mod_fee = a . GetModifiedFee ( ) ;
size = a . GetTxSize ( ) ;
}
}
} ;
} ;
// Multi_index tag names
// Multi_index tag names