digitalmars.D.learn - Creating a RedBlackTree
- Bogdan (31/31) May 15 2019 I don't have any experience with using templates. Is it possible
- Stefan Koch (3/34) May 15 2019 Key controller cannot be compared by less
- Bogdan (33/35) May 15 2019 Works fine, thank you! For some reason, I thought that this
- drug (6/44) May 15 2019 You can use predicate for this purpose:
- Bogdan (2/7) May 15 2019 Even better, thank you!
I don't have any experience with using templates. Is it possible
to create a RB tree containing structs, where the nodes are
ordered by one struct member?
```
import std.stdio;
import std.container;
enum KeyID: uint
{
KEY_A,
KEY_S,
KEY_D,
KEY_W
}
struct KeyController
{
KeyID ID;
bool isDown;
}
void main()
{
auto rbt = redBlackTree!KeyController;
}
```
When I run this I get a compile error:
```
Error: template instance
`std.container.rbtree.RedBlackTree!(KeyController)` does not
match template declaration RedBlackTree(T, alias less = "a < b",
bool allowDuplicates = false) if
(is(typeof(binaryFun!less(T.init, T.init))))
```
May 15 2019
On Wednesday, 15 May 2019 at 13:08:18 UTC, Bogdan wrote:
I don't have any experience with using templates. Is it
possible to create a RB tree containing structs, where the
nodes are ordered by one struct member?
```
import std.stdio;
import std.container;
enum KeyID: uint
{
KEY_A,
KEY_S,
KEY_D,
KEY_W
}
struct KeyController
{
KeyID ID;
bool isDown;
}
void main()
{
auto rbt = redBlackTree!KeyController;
}
```
When I run this I get a compile error:
```
Error: template instance
`std.container.rbtree.RedBlackTree!(KeyController)` does not
match template declaration RedBlackTree(T, alias less = "a <
b", bool allowDuplicates = false) if
(is(typeof(binaryFun!less(T.init, T.init))))
```
Key controller cannot be compared by less
which is why it fails, give it an opCmp and it'll work.
May 15 2019
On Wednesday, 15 May 2019 at 13:15:50 UTC, Stefan Koch wrote:Key controller cannot be compared by less which is why it fails, give it an opCmp and it'll work.Works fine, thank you! For some reason, I thought that this template uses references: ``` enum KeyID: uint { KEY_A, KEY_S, KEY_D, KEY_W } struct KeyController { KeyID ID; bool isDown; int opCmp(ref const KeyController other) const {return this.ID - other.ID;} } void main() { KeyController[] monitoredKeys = [{KeyID.KEY_A}]; auto rbt = redBlackTree!KeyController; rbt.insert(monitoredKeys); writeln(rbt); monitoredKeys[0].isDown = true; writeln(rbt); } ``` Output: ``` RedBlackTree([const(KeyController)(KEY_A, false)]) RedBlackTree([const(KeyController)(KEY_A, false)]) ```
May 15 2019
On 15.05.2019 16:08, Bogdan wrote:
I don't have any experience with using templates. Is it possible to
create a RB tree containing structs, where the nodes are ordered by one
struct member?
```
import std.stdio;
import std.container;
enum KeyID: uint
{
KEY_A,
KEY_S,
KEY_D,
KEY_W
}
struct KeyController
{
KeyID ID;
bool isDown;
}
void main()
{
auto rbt = redBlackTree!KeyController;
}
```
When I run this I get a compile error:
```
Error: template instance
`std.container.rbtree.RedBlackTree!(KeyController)` does not match
template declaration RedBlackTree(T, alias less = "a < b", bool
allowDuplicates = false) if (is(typeof(binaryFun!less(T.init, T.init))))
```
You can use predicate for this purpose:
```
auto rbt = redBlackTree!((a, b) => a.ID < b.ID, KeyController);
```
https://run.dlang.io/is/CNRTQf
May 15 2019
On Wednesday, 15 May 2019 at 13:19:36 UTC, drug wrote:You can use predicate for this purpose: ``` auto rbt = redBlackTree!((a, b) => a.ID < b.ID, KeyController); ``` https://run.dlang.io/is/CNRTQfEven better, thank you!
May 15 2019









Bogdan <olar.bogdan.dev gmail.com> 