Changeset 73e3791 in mainline for uspace/lib/cpp/include/internal/rbtree_policies.hpp
- Timestamp:
- 2018-07-05T21:41:23Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 27f1bc0
- Parents:
- 6175b78
- git-author:
- Dzejrou <dzejrou@…> (2018-05-13 22:57:14)
- git-committer:
- Dzejrou <dzejrou@…> (2018-07-05 21:41:23)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/cpp/include/internal/rbtree_policies.hpp
r6175b78 r73e3791 59 59 static typename Tree::iterator lower_bound(const Tree& tree, const Key& key) 60 60 { 61 using iterator = typename Tree::iterator; 61 using iterator = typename Tree::iterator; 62 using node_type = typename Tree::node_type; 62 63 63 64 auto it = lower_bound_const(tree, key); 64 65 65 return iterator{ it.node(), it.end()};66 return iterator{const_cast<node_type*>(it.node()), it.end()}; 66 67 } 67 68 … … 101 102 static typename Tree::iterator upper_bound(const Tree& tree, const Key& key) 102 103 { 103 using iterator = typename Tree::iterator; 104 using iterator = typename Tree::iterator; 105 using node_type = typename Tree::node_type; 104 106 105 107 auto it = upper_bound_const(tree, key); 106 108 107 return iterator{ it.node(), it.end()};109 return iterator{const_cast<node_type*>(it.node()), it.end()}; 108 110 } 109 111 … … 113 115 /** 114 116 * If key isn't in the tree, we get it's 115 * successor or tree.end(). If key is 116 * in the tree, we get it. 117 * In the first case, the successor is also 118 * the upper bound, so we just return it, 119 * otherwise (as long as it != end()) we 120 * increment. 117 * predecessor or tree.end(). If key is 118 * in the tree, we get it. So unless it 119 * is equal to end(), we can increment it 120 * to get the upper bound. 121 121 */ 122 122 auto it = lower_bound_const(tree, key); 123 123 if (it == tree.end()) 124 124 return it; 125 else if (tree.keys_equal(key, *it))125 else 126 126 return ++it; 127 else128 return it;129 127 } 130 128 … … 176 174 177 175 auto node = new node_type{move(val)}; 178 tree.insert_node(node, parent); 179 180 return make_pair(iterator{node, false}, true); 176 177 return insert(tree, node, parent); 181 178 } 182 179 … … 194 191 195 192 auto node = new node_type{val}; 196 tree.insert_node(node, parent); 197 198 return make_pair(iterator{node, false}, true); 193 194 return insert(tree, node, parent); 199 195 } 200 196 … … 212 208 213 209 auto node = new node_type{forward<Value>(val)}; 214 tree.insert_node(node, parent); 210 211 return insert(tree, node, parent); 212 } 213 214 template<class Tree> 215 static pair< 216 typename Tree::iterator, bool 217 > insert( 218 Tree& tree, typename Tree::node_type* node, 219 typename Tree::node_type* parent 220 ) 221 { 222 using iterator = typename Tree::iterator; 223 224 if (!node) 225 return make_pair(tree.end(), false); 226 227 ++tree.size_; 228 if (!parent) 229 { 230 node->color = rbcolor::black; 231 tree.root_ = node; 232 } 233 else 234 { 235 if (tree.keys_comp(tree.get_key(node->value), parent->value)) 236 parent->add_left_child(node); 237 else 238 parent->add_right_child(node); 239 240 tree.repair_after_insert_(node); 241 tree.update_root_(node); 242 } 215 243 216 244 return make_pair(iterator{node, false}, true); … … 308 336 /** 309 337 * If key isn't in the tree, we get it's 310 * successor or tree.end(). If key is 311 * in the tree, we get it. 312 * In the first case, the successor is also 313 * the upper bound, so we just return it, 314 * otherwise (as long as it != end()) we 315 * increment. 338 * predecessor or tree.end(). If key is 339 * in the tree, we get it. So unless it 340 * is equal to end(), we keep incrementing 341 * until we get to the next key. 316 342 */ 317 343 auto it = lower_bound(tree, key); … … 320 346 else if (tree.keys_equal(tree.get_key(*it), key)) 321 347 { 322 while ( tree.keys_equal(tree.get_key(*it), key))348 while (it != tree.end() && tree.keys_equal(tree.get_key(*it), key)) 323 349 ++it; 324 350 … … 384 410 385 411 template<class Tree> 386 static typename Tree::iterator insert(Tree& tree, typename Tree::node_type* node) 387 { 388 using iterator = typename Tree::iterator; 412 static typename Tree::iterator insert( 413 Tree& tree, typename Tree::node_type* node, 414 typename Tree::node_type* = nullptr 415 ) 416 { 417 using iterator = typename Tree::iterator; 418 419 if (!node) 420 return tree.end(); 389 421 390 422 auto parent = tree.find_parent_for_insertion(tree.get_key(node->value)); 391 tree.insert_node(node, parent); 423 424 ++tree.size_; 425 if (!parent) 426 { 427 node->color = rbcolor::black; 428 tree.root_ = node; 429 } 430 else 431 { 432 if (tree.keys_comp(tree.get_key(node->value), parent->value)) 433 parent->add_left_child(node); 434 else if (tree.keys_comp(tree.get_key(parent->value), node->value)) 435 parent->add_right_child(node); 436 else 437 { 438 parent->add(node); // List of nodes with equivalent keys. 439 tree.update_root_(parent); 440 441 return iterator{node, false}; 442 } 443 444 tree.repair_after_insert_(node); 445 tree.update_root_(node); 446 } 392 447 393 448 return iterator{node, false};
Note:
See TracChangeset
for help on using the changeset viewer.