return do_remove(
key,
key_comparator(),
- []( mapped_type pVal ) -> bool { free_value( pVal ); return true; }
+ []( mapped_type pVal, rcu_disposer& disp ) -> bool { disp.dispose_value( pVal ); return true; }
);
}
return do_remove(
key,
cds::opt::details::make_comparator_from_less<Less>(),
- []( mapped_type pVal ) -> bool { free_value( pVal ); return true; }
+ []( mapped_type pVal, rcu_disposer& disp ) -> bool { disp.dispose_value( pVal ); return true; }
);
}
return do_remove(
key,
key_comparator(),
- [&f]( mapped_type pVal ) -> bool {
+ [&f]( mapped_type pVal, rcu_disposer& disp ) -> bool {
assert( pVal );
f( *pVal );
- free_value(pVal);
+ disp.dispose_value(pVal);
return true;
}
);
return do_remove(
key,
cds::opt::details::make_comparator_from_less<Less>(),
- [&f]( mapped_type pVal ) -> bool {
+ [&f]( mapped_type pVal, rcu_disposer& disp ) -> bool {
assert( pVal );
f( *pVal );
- free_value(pVal);
+ disp.dispose_value(pVal);
return true;
}
);
do_extract_minmax(
left_child,
- [&pExtracted]( mapped_type pVal ) -> bool { pExtracted.reset( pVal ); return false; }
+ [&pExtracted]( mapped_type pVal, rcu_disposer& ) -> bool { pExtracted.reset( pVal ); return false; }
);
return pExtracted;
}
do_extract_minmax(
right_child,
- [&pExtracted]( mapped_type pVal ) -> bool { pExtracted.reset( pVal ); return false; }
+ [&pExtracted]( mapped_type pVal, rcu_disposer& ) -> bool { pExtracted.reset( pVal ); return false; }
);
return pExtracted;
}
do_remove(
key,
key_comparator(),
- [&pExtracted]( mapped_type pVal ) -> bool { pExtracted.reset( pVal ); return false; }
+ [&pExtracted]( mapped_type pVal, rcu_disposer& ) -> bool { pExtracted.reset( pVal ); return false; }
);
return pExtracted;
}
do_remove(
key,
cds::opt::details::make_comparator_from_less<Less>(),
- [&pExtracted]( mapped_type pVal ) -> bool { pExtracted.reset( pVal ); return false; }
+ [&pExtracted]( mapped_type pVal, rcu_disposer& ) -> bool { pExtracted.reset( pVal ); return false; }
);
return pExtracted;
}
int nCmp = cmp( key, pNode->m_key );
if ( nCmp == 0 ) {
if ( nFlags & update_flags::allow_update ) {
- return try_update_node( funcUpdate, pNode );
+ return try_update_node( funcUpdate, pNode, disp );
}
return update_flags::failed;
}
}
template <typename Func>
- int try_update_node( Func funcUpdate, node_type * pNode )
+ int try_update_node( Func funcUpdate, node_type * pNode, rcu_disposer& disp )
{
mapped_type pOld;
assert( pNode != nullptr );
}
if ( pOld ) {
- free_value(pOld);
+ disp.dispose_value(pOld);
m_stat.onDisposeValue();
}
}
--m_ItemCounter;
- if ( func( pOld ) ) // calls pOld disposer inside
+ if ( func( pOld, disp )) // calls pOld disposer inside
m_stat.onDisposeValue();
else
m_stat.onExtractValue();
if ( result == update_flags::result_removed ) {
--m_ItemCounter;
- if ( func( pOld )) // calls pOld disposer inside
+ if ( func( pOld, disp )) // calls pOld disposer inside
m_stat.onDisposeValue();
else
m_stat.onExtractValue();