module bag;
import std.container.rbtree : RedBlackTree; // template
import std.stdio : writeln;
struct Location
{
int r; // row
int c; // column
}
struct Node
{
this(Location locale, uint f) {
this.locale = locale;
this.f = f;
}
Location locale;
uint f;
}
struct Bag
{
void addTo(Node node) {
this.rbt.insert(node); // add to red black tree, rbt
this.aa[node.locale] = node.f; // add to associative array, aa
}
void display() {
writeln("======= Bag: ", this.name, " =======");
writeln("associative array of ", this.name, " has length ", this.aa.length);
foreach(keyValuePair; this.aa.byKeyValue())
{
writeln("Key: ", keyValuePair.key, ", Value: ", keyValuePair.value);
}
writeln("red black tree of ", this.name, " has length ", this.rbt.length);
foreach(node; this.rbt)
{
writeln("node: ", node);
}
}
void setName(string n) { this.name = n; }
string name;
uint[Location] aa; // associative array
auto rbt = new RedBlackTree!(Node, "a.f < b.f", true); // true: allowDuplicates
}
unittest
{
Bag paper;
Bag cloth;
paper.setName("Brown");
cloth.setName("Green");
paper.addTo( Node(Location(1,2), 33) );
paper.addTo( Node(Location(3,4), 20) ); // duplicate
cloth.addTo( Node(Location(9,10), 20) ); // duplicate
cloth.addTo( Node(Location(11,12), 97) );
cloth.addTo( Node(Location(13,14), 20) ); // duplicate
paper.display;
cloth.display;
}
rdmd -main -unittest bag.d
returned the following:
======= Bag: Brown =======
associative array of Brown has length 2
Key: Location(1, 2), Value: 33
Key: Location(3, 4), Value: 20
red black tree of Brown has length 5
node: Node(Location(3, 4), 20)
node: Node(Location(9, 10), 20)
node: Node(Location(13, 14), 20)
node: Node(Location(1, 2), 33)
node: Node(Location(11, 12), 97)
======= Bag: Green =======
associative array of Green has length 3
Key: Location(9, 10), Value: 20
Key: Location(13, 14), Value: 20
Key: Location(11, 12), Value: 97
red black tree of Green has length 5
node: Node(Location(3, 4), 20)
node: Node(Location(9, 10), 20)
node: Node(Location(13, 14), 20)
node: Node(Location(1, 2), 33)
node: Node(Location(11, 12), 97)
1 modules passed unittests
Why aren't the redblack trees being split up properly between paper and cloth like the associative arrays? It's like the trees are sharing their values across the separate struct objects.
Note: I then created another struct 99% identical to Bag but this time called it Sack. So like the following:
Bag paper;
Sack cloth;
This time it worked as expected:
======= Bag: Brown =======
associative array of Brown has length 2
Key: Location(1, 2), Value: 33
Key: Location(3, 4), Value: 20
red black tree of Brown has length 2
node: Node(Location(3, 4), 20)
node: Node(Location(1, 2), 33)
======= Sack: Green =======
associative array of Green has length 3
Key: Location(9, 10), Value: 20
Key: Location(13, 14), Value: 20
Key: Location(11, 12), Value: 97
red black tree of Green has length 3
node: Node(Location(9, 10), 20)
node: Node(Location(13, 14), 20)
node: Node(Location(11, 12), 97)
1 modules passed unittests