More Generic Variants of findSplit.*() in Demangling/Parsing

"Nordlöw" via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Aug 14 13:25:18 PDT 2014


I'm currently working on implementing demangling of ELF C++ 
symbols according to

https://en.wikipedia.org/wiki/Name_mangling

A reoccurring pattern high-level pattern is to use the 
std.algorithm: findSplit.* functions to make algorithm 
single-pass when possible.

I'm however lacking a variant of this that takes a condition 
template argument instead of an input range element as function 
parameter.

Something like

auto findSplitBefore(alias condition, R)(R range) if 
(isInputRange!R)
{
     import std.algorithm: until;
     auto hit = range.until!condition;
     auto rest = "";
     return tuple(hit, rest);
}

unittest
{
     import std.algorithm: equal;
     import std.ascii: isDigit;
     auto x = "11ab".findSplitBefore!(a => !a.isDigit);
     assert(equal(x[0], "11"));
     /* assert(equal(x[1], "ab")); */
}

But how do I get the second part in a single pass?

Is copying (duplicating) the existing Phobos implementations the 
only alternative here?

If so I believe we should generalize these Phobos algorithms into 
the variants described above and implement the old ones by 
calling the generalized ones typically as

auto findSplit(R)(R range, E element) if (isInputRange!R)
{
     return range.findSplit!(a => a == element);
}

BTW: Does anybody have any good refs on ELF C++ demangling. The 
wikipedia article is a bit sparse.

Destroy!


More information about the Digitalmars-d-learn mailing list