Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
May 15, 2019 Creating a RedBlackTree | ||||
---|---|---|---|---|
| ||||
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 Re: Creating a RedBlackTree | ||||
---|---|---|---|---|
| ||||
Posted in reply to Bogdan | 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 Re: Creating a RedBlackTree | ||||
---|---|---|---|---|
| ||||
Posted in reply to Bogdan | 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 Re: Creating a RedBlackTree | ||||
---|---|---|---|---|
| ||||
Posted in reply to Stefan Koch | 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 Re: Creating a RedBlackTree | ||||
---|---|---|---|---|
| ||||
Posted in reply to drug | 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/CNRTQf
Even better, thank you!
|
Copyright © 1999-2021 by the D Language Foundation