Adding item to a rbtree with a custom binaryFun

Adnan relay.public.adnan at outlook.com
Tue Apr 14 00:31:19 UTC 2020


On Monday, 13 April 2020 at 23:59:20 UTC, Adnan wrote:
> I want to keep an ordered set of records and the standard 
> provides me with RedBlackTree. The record is of type 
> Tuple!(string, uint). Here's what it looks like:
>
> import std.json : parseJSON;
>
> 	uint[string] wordTable;
> 	import std.datetime.stopwatch : StopWatch, AutoStart;
>
> 	auto sw = StopWatch(AutoStart.yes);
> 	const auto j = parseJSON(get(link));
> 	const long downloadTime = sw.peek.total!"msecs";
>
> 	import std.typecons : Tuple, tuple;
> 	import std.container.rbtree : RedBlackTree;
> 	import std.functional : binaryFun;
>
> 	RedBlackTree!(Tuple!(string, uint), binaryFun!("a[1] > b[1]")) 
> records;
>
> 	foreach (node; j["posts"].array()) {
> 		import std.stdio : writeln;
> 		import std.utf : decode;
>
> 		if ("com" in node) {
> 			import std.algorithm : splitter;
>
> 			foreach (word; getStr(node["com"].str()).splitter(' ')) {
> 				import std.string : strip;
>
> 				if (word.strip().length > 0)
> 					wordTable.require(word, 0)++;
>
> 				records ~= (tuple(word, wordTable[word])); // error
> 			}
> 		}
> 	}
>
> Now primarily I used `insert()` method to add a record to the 
> records but it causes segfault in runtime. So I decided to use 
> ~= to see what's going on. Here's what the compiler says:
>
> Error: cannot append type Tuple!(string, uint) to type 
> std.container.rbtree.RedBlackTree!(Tuple!(string, uint), 
> binaryFun, false)
>
>
> So the gist of the question is, if I have an RedBlackTree with 
> a custom binaryFun, how can I add tuples to it?

I also tried creating a new type:
		struct Record {
		string k;
		uint v;

		int opCmp(ref const Record other) const {
			return v - other.v;
		}
	}
	
	bool less(Record a, Record b) {
             return a < b;
     }

	RedBlackTree!(Record) records;

	foreach (node; j["posts"].array()) {
		import std.utf : decode;

		if ("com" in node) {
			import std.algorithm : splitter;

			foreach (word; getStr(node["com"].str()).splitter(' ')) {
				import std.string : strip;

				if (word.strip().length > 0)
					wordTable.require(word, 0)++;

				records ~= Record(word, wordTable[word]);
			}
		}
	}

Compiler says:

  Error: cannot append type Record to type 
std.container.rbtree.RedBlackTree!(Recor
d, "a < b", false)
source/app.d(153,18): Error: no [] operator overload for type 
Record
source/app.d(157,58): Error: no [] operator overload for type 
Record
source/app.d(158,40): Error: no [] operator overload for type 
Record


More information about the Digitalmars-d-learn mailing list