@@ -32,7 +32,7 @@ struct get_idx<Key,
3232
3333 static node* get (std::vector<node*>& sequence, const Key& key,
3434 shared_memory_holder pMemory) {
35- if (key > sequence.size () || (key > 0 && !sequence[key- 1 ]->is_defined ()))
35+ if (key > sequence.size () || (key > 0 && !sequence[key - 1 ]->is_defined ()))
3636 return 0 ;
3737 if (key == sequence.size ())
3838 sequence.push_back (&pMemory->create_node ());
@@ -56,6 +56,37 @@ struct get_idx<Key, typename std::enable_if<std::is_signed<Key>::value>::type> {
5656 }
5757};
5858
59+ template <typename Key, typename Enable = void >
60+ struct remove_idx {
61+ static bool remove (std::vector<node*>&, const Key&) { return false ; }
62+ };
63+
64+ template <typename Key>
65+ struct remove_idx <
66+ Key, typename std::enable_if<std::is_unsigned<Key>::value &&
67+ !std::is_same<Key, bool >::value>::type> {
68+
69+ static bool remove (std::vector<node*>& sequence, const Key& key) {
70+ if (key >= sequence.size ()) {
71+ return false ;
72+ } else {
73+ sequence.erase (sequence.begin () + key);
74+ return true ;
75+ }
76+ }
77+ };
78+
79+ template <typename Key>
80+ struct remove_idx <Key,
81+ typename std::enable_if<std::is_signed<Key>::value>::type> {
82+
83+ static bool remove (std::vector<node*>& sequence, const Key& key) {
84+ return key >= 0 ? remove_idx<std::size_t >::remove (
85+ sequence, static_cast <std::size_t >(key))
86+ : false ;
87+ }
88+ };
89+
5990template <typename T>
6091inline bool node::equals (const T& rhs, shared_memory_holder pMemory) {
6192 T lhs;
@@ -129,21 +160,23 @@ inline node& node_data::get(const Key& key, shared_memory_holder pMemory) {
129160
130161template <typename Key>
131162inline bool node_data::remove (const Key& key, shared_memory_holder pMemory) {
132- if (m_type != NodeType::Map)
133- return false ;
134-
135- for (kv_pairs::iterator it = m_undefinedPairs.begin ();
136- it != m_undefinedPairs.end ();) {
137- kv_pairs::iterator jt = std::next (it);
138- if (it->first ->equals (key, pMemory))
139- m_undefinedPairs.erase (it);
140- it = jt;
141- }
163+ if (m_type == NodeType::Sequence) {
164+ return remove_idx<Key>::remove (m_sequence, key);
165+ } else if (m_type == NodeType::Map) {
166+ kv_pairs::iterator it = m_undefinedPairs.begin ();
167+ while (it != m_undefinedPairs.end ()) {
168+ kv_pairs::iterator jt = std::next (it);
169+ if (it->first ->equals (key, pMemory)) {
170+ m_undefinedPairs.erase (it);
171+ }
172+ it = jt;
173+ }
142174
143- for (node_map::iterator it = m_map.begin (); it != m_map.end (); ++it) {
144- if (it->first ->equals (key, pMemory)) {
145- m_map.erase (it);
146- return true ;
175+ for (node_map::iterator it = m_map.begin (); it != m_map.end (); ++it) {
176+ if (it->first ->equals (key, pMemory)) {
177+ m_map.erase (it);
178+ return true ;
179+ }
147180 }
148181 }
149182
0 commit comments