Skip to content

Commit e05393d

Browse files
committed
Improve tlx
1 parent af90a24 commit e05393d

File tree

2 files changed

+43
-3
lines changed

2 files changed

+43
-3
lines changed

axmol/tlx/flat_map.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class flat_map : public detail::flat_map_base<flat_map_traits<Key, T, Compare, K
6767
auto pos = it._k_it;
6868
auto idx = pos - this->_Mykeys._Myval2.begin();
6969
this->_Mykeys._Myval2.insert(pos, key);
70-
this->_Myvals.insert(this->_Myvals.begin() + idx, T{});
70+
this->_Myvals.emplace(this->_Myvals.begin() + idx);
7171
it = typename impl_type::iterator(this->_Mykeys._Myval2.begin() + idx, this->_Myvals.begin() + idx);
7272
}
7373
return (*it).second;

axmol/tlx/flat_map_base.hpp

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,12 @@ class flat_map_base
6363

6464
class iterator
6565
{
66+
public:
6667
using key_iter = typename key_container::iterator;
6768
using mapped_iter = typename mapped_container::iterator;
6869
key_iter _k_it;
6970
mapped_iter _v_it;
7071

71-
public:
7272
using difference_type = typename key_container::difference_type;
7373
using value_type = value_proxy;
7474
using reference = value_proxy;
@@ -98,12 +98,12 @@ class flat_map_base
9898

9999
class const_iterator
100100
{
101+
public:
101102
using key_iter = typename key_container::const_iterator;
102103
using mapped_iter = typename mapped_container::const_iterator;
103104
key_iter _k_it;
104105
mapped_iter _v_it;
105106

106-
public:
107107
using difference_type = typename key_container::difference_type;
108108
using value_type = value_proxy;
109109
using reference = value_proxy;
@@ -233,6 +233,46 @@ class flat_map_base
233233
}
234234
}
235235

236+
// erase by iterator
237+
iterator erase(iterator pos)
238+
{
239+
auto k_it = pos._k_it;
240+
auto v_it = pos._v_it;
241+
_Mykeys._Myval2.erase(k_it);
242+
_Myvals.erase(v_it);
243+
return iterator(k_it, v_it);
244+
}
245+
246+
// erase by key
247+
size_type erase(const key_type& key)
248+
{
249+
const auto& pred = _Mykeys._Get_first();
250+
auto k_it = std::lower_bound(_Mykeys._Myval2.begin(), _Mykeys._Myval2.end(), key, pred);
251+
auto v_it = _Myvals.begin() + (k_it - _Mykeys._Myval2.begin());
252+
253+
if (k_it == _Mykeys._Myval2.end() || pred(key, *k_it) || pred(*k_it, key))
254+
return 0; // not found
255+
256+
if constexpr (_Traits::allow_duplicates)
257+
{
258+
// multimap: erase all equal keys
259+
auto k_end = std::upper_bound(k_it, _Mykeys._Myval2.end(), key, pred);
260+
auto v_end = _Myvals.begin() + (k_end - _Mykeys._Myval2.begin());
261+
262+
size_type count = static_cast<size_type>(k_end - k_it);
263+
_Mykeys._Myval2.erase(k_it, k_end);
264+
_Myvals.erase(v_it, v_end);
265+
return count;
266+
}
267+
else
268+
{
269+
// map: erase single element
270+
_Mykeys._Myval2.erase(k_it);
271+
_Myvals.erase(v_it);
272+
return 1;
273+
}
274+
}
275+
236276
const auto& keys() const { return _Mykeys; }
237277

238278
protected:

0 commit comments

Comments
 (0)