return !(*this == x);
}
value_type& operator*() {
+ _libcxx_assert(m_index < m_map->m_size);
return m_map->m_items[m_index];
}
value_type* operator->() {
+ _libcxx_assert(m_index < m_map->m_size);
return &m_map->m_items[m_index];
}
};
iterator it = upper_bound(k);
if( it == end() || m_comp(k, it->first) ) { // if k < it->first, no match
insert_at(it.m_index, value_type(k,mapped_type()) );
- ++ it;
}
return it->second;
}
// Modifiers
// - insert
- pair<iterator,bool> insert(const value_type& val);
+ pair<iterator,bool> insert(const value_type& val)
+ {
+ const key_type& k = val.first;
+ iterator it = upper_bound(k);
+ if( it == end() || m_comp(k, it->first) ) { // if k < it->first, no match
+ insert_at(it.m_index, value_type(k,mapped_type()) );
+ return pair<iterator,bool>(it, true);
+ }
+ else {
+ return pair<iterator,bool>(it, false);
+ }
+ }
iterator insert(iterator position, const value_type& val);
template <class InputInterator>
void insert(InputInterator first, InputInterator last);
// - erase
- void erase(iterator position);
- size_type erase(const key_type& k);
- void erase(iterator first, iterator last);
+ void erase(iterator position)
+ {
+ auto pos = position;
+ erase(pos, ++position);
+ }
+ size_type erase(const key_type& k)
+ {
+ auto it = find(k);
+ if( it != end() ) {
+ erase(it);
+ return 1;
+ }
+ else {
+ return 0;
+ }
+ }
+ void erase(iterator first, iterator last)
+ {
+ _libcxx_assert(first.m_index <= last.m_index);
+ unsigned int ofs = first.m_index;
+ unsigned int count = last.m_index - first.m_index;
+ for( unsigned int i = 0; i < count; i ++ )
+ {
+ // Construct new item
+ m_alloc.destroy(&m_items[ofs]);
+ m_size --;
+ // Move following items down
+ shift_items(&m_items[ofs+1], &m_items[ofs], m_size-ofs);
+ }
+ }
// - swap
void swap(map& x);
// - clear
pos_out = pos;
return false;
#else
+ //::_sys::debug("map::_search (m_size=%i)", m_size);
for( size_type pos = 0; pos < m_size; pos ++ )
{
const key_type& item_key = m_items[pos].first;
continue;
}
else if( m_comp(k, item_key) ) {
+ //::_sys::debug("map::_search - Passed %i", pos);
pos_out = pos;
return false;
}
else {
+ //::_sys::debug("map::_search - Found %i", pos);
pos_out = pos;
return true;
}
}
+ //::_sys::debug("map::_search - Off end %i", m_size);
pos_out = m_size;
return false;
#endif
}
void insert_at(size_type ofs, const value_type& val) {
- //assert( ofs == 0 || m_comp(m_items[ofs-1].first, val.first) );
- //assert( ofs == m_size || m_comp(m_items[ofs].first, val.first) );
- ::_sys::debug("map::insert_at(%i,)", ofs);
+ //_libcxx_assert( ofs == 0 || m_comp(m_items[ofs-1].first, val.first) );
+ //_libcxx_assert( ofs == m_size || m_comp(m_items[ofs].first, val.first) );
// Resize up
reserve( m_size + 1 );
// Move following items up