| @safe pure unittest |
| { |
| import std.container.rbtree; |
| |
| import std.algorithm.comparison : equal; |
| import std.container.rbtree; |
| |
| auto rbt = redBlackTree(3, 1, 4, 2, 5); |
| assert(rbt.front == 1); |
| assert(equal(rbt[], [1, 2, 3, 4, 5])); |
| |
| rbt.removeKey(1, 4); |
| assert(equal(rbt[], [2, 3, 5])); |
| |
| rbt.removeFront(); |
| assert(equal(rbt[], [3, 5])); |
| |
| rbt.insert([1, 2, 4]); |
| assert(equal(rbt[], [1, 2, 3, 4, 5])); |
| |
| // Query bounds in O(log(n)) |
| assert(rbt.lowerBound(3).equal([1, 2])); |
| assert(rbt.equalRange(3).equal([3])); |
| assert(rbt.upperBound(3).equal([4, 5])); |
| |
| // A Red Black tree with the highest element at front: |
| import std.range : iota; |
| auto maxTree = redBlackTree!"a > b"(iota(5)); |
| assert(equal(maxTree[], [4, 3, 2, 1, 0])); |
| |
| // adding duplicates will not add them, but return 0 |
| auto rbt2 = redBlackTree(1, 3); |
| assert(rbt2.insert(1) == 0); |
| assert(equal(rbt2[], [1, 3])); |
| assert(rbt2.insert(2) == 1); |
| |
| // however you can allow duplicates |
| auto ubt = redBlackTree!true([0, 1, 0, 1]); |
| assert(equal(ubt[], [0, 0, 1, 1])); |
| } |
| |
| @safe pure unittest |
| { |
| import std.container.rbtree; |
| |
| import std.range : iota; |
| |
| auto rbt1 = redBlackTree(0, 1, 5, 7); |
| auto rbt2 = redBlackTree!string("hello", "world"); |
| auto rbt3 = redBlackTree!true(0, 1, 5, 7, 5); |
| auto rbt4 = redBlackTree!"a > b"(0, 1, 5, 7); |
| auto rbt5 = redBlackTree!("a > b", true)(0.1, 1.3, 5.9, 7.2, 5.9); |
| |
| // also works with ranges |
| auto rbt6 = redBlackTree(iota(3)); |
| auto rbt7 = redBlackTree!true(iota(3)); |
| auto rbt8 = redBlackTree!"a > b"(iota(3)); |
| auto rbt9 = redBlackTree!("a > b", true)(iota(3)); |
| } |
| |