15 #include <stk_util/util/CSet.hpp> 21 typedef void (* DeleteFunction )(
void * );
23 typedef std::pair< const std::type_info * , DeleteFunction > Manager ;
28 bool operator()(
const Manager & lhs ,
29 const std::type_info & rhs )
const ;
30 bool operator()(
const std::type_info & lhs ,
31 const Manager & rhs )
const ;
39 bool less_cset::operator()(
const Manager & lhs ,
40 const std::type_info & rhs )
const 41 {
return lhs.first->before( rhs ) && * lhs.first != rhs ; }
43 bool less_cset::operator()(
const std::type_info & lhs ,
44 const Manager & rhs )
const 45 {
return lhs.before( *rhs.first ) && lhs != *rhs.first ; }
48 std::vector< Manager >::iterator
49 lower_bound( std::vector< Manager > & v ,
const std::type_info & t )
51 std::vector< Manager >::iterator i = v.begin();
52 std::vector< Manager >::iterator j = v.end();
54 return std::lower_bound( i , j , t , less_cset() );
60 bool operator()(
const Manager& lhs,
const std::type_info& rhs)
const 61 {
return *lhs.first == rhs; }
62 bool operator()(
const std::type_info& lhs,
const Manager& rhs)
const 63 {
return lhs == *rhs.first; }
68 const void * CSet::p_get(
const std::type_info & t )
const 70 for(std::vector<Manager>::const_iterator it=m_manager.begin(), end=m_manager.end(); it!=end; ++it) {
71 if (*it->first == t)
return m_value[it-m_manager.begin()];
78 CSet::p_insert(
const Manager & m ,
const void * v )
80 std::vector< Manager >::iterator im = lower_bound( m_manager , * m.first );
82 const size_t offset = im - m_manager.begin();
84 assert(m_value.size() == m_manager.size());
85 std::vector<const void *>::iterator iv = m_value.begin();
86 std::advance( iv , offset );
88 if ( im == m_manager.end() || * m.first != * im->first ) {
89 im = m_manager.insert( im , m );
90 iv = m_value .insert( iv , v );
93 assert(iv != m_value.end());
97 bool CSet::p_remove(
const std::type_info & t ,
const void * v )
100 const std::vector< Manager >::iterator im = lower_bound( m_manager , t );
102 if (im != m_manager.end()) {
103 const size_t offset = im - m_manager.begin();
105 if (offset <= m_value.size()) {
106 std::vector<const void *>::iterator iv = m_value.begin();
107 std::advance( iv , offset );
109 result = t == * im->first && v == * iv ;
112 m_manager.erase( im );
113 m_value .erase( iv );
125 const size_t n = m_manager.size();
126 for (
size_t i = 0 ; i < n ; ++i ) {
128 if ( m_manager[i].second ) {
129 (*m_manager[i].second)( const_cast<void*>( m_value[i] ) );
136 CSet::CSet() : m_manager(), m_value() {}