Making generalized Trie type in D

Dmitry Olshansky dmitry.olsh at gmail.com
Tue Jun 5 05:57:07 PDT 2012


On 05.06.2012 9:33, Roman D. Boiko wrote:
> On Tuesday, 5 June 2012 at 05:28:48 UTC, Roman D. Boiko wrote:
>> ... without deep analysis I can't come up with a good API / design for
>> that (without overcomplicating it). Probably keeping mutable and
>> immutable APIs separate is the best choice. Will return to this
>> problem once I get a bit of free time.
> Simplest and possibly the best approach is to provide an immutable
> wrapper over mutable implementation, but that may be difficult to make
> efficient given the need to support insert / delete as common operations.
>

I suspect I would have to add another policy like Persistent that will 
preallocate some slack space implicitly so that some pages can be 
shallowly copied on each assign(a-la COW) and immutable parts still reused.
Another simpler way would be to use an separate field "pointer-to-actual 
base" for each level, thus allowing it to redirect it away to new 
(modified) copy. Still looks like policy as it _maybe_  slightly slower.

Anyway as a start this should work:

auto modifyDupGlobalImmutableTrie(Trie(immutable(T), ...) t
	, scope delegate(Trie(immutable(T), ...) )pure dg) __pure__
{
	auto copy = t.dup;//this would be one day a shallow copy
	with(copy)
	{	
		dg(copy);
	}
	return copy;
}

//later on
{
...
immutable newTrie = modifyDupGlobalImmutableTrie(yourTrie);
...
}

-- 
Dmitry Olshansky


More information about the Digitalmars-d mailing list