Supporting inout haystack in array-overload of findSplitBefore without template-bloat
Per Nordlöw
per.nordlow at gmail.com
Sun Oct 27 15:21:10 UTC 2019
On Sunday, 27 October 2019 at 14:57:29 UTC, Per Nordlöw wrote:
> @safe pure nothrow @nogc unittest
> {
> auto r = "a*b".findSplitAfter_inout('*');
> static assert(is(typeof(r.pre()) == string));
> assert(r);
> assert(r.pre == "a*");
> assert(r.post == "b");
> }
Made it work! :)
/** Array-overload for `findSplitAfter` with default predicate.
*
* See_Also:
https://forum.dlang.org/post/dhxwgtaubzbmjaqjmnmq@forum.dlang.org
*/
auto findSplitAfter(T)(scope inout(T)[] haystack, // TODO support
inout? See_Also:
https://forum.dlang.org/post/jtpchtddgenhjuwhqdsq@forum.dlang.org
scope const T needle) @trusted
{
static struct Result
{
private T[] _haystack;
private size_t _offset;
pragma(inline, true):
inout(T)[] pre() @trusted inout
{
if (_isMiss) { return _haystack[$ .. $]; }
return _haystack.ptr[0 .. _offset + 1];
}
inout(T)[] post() @trusted inout
{
if (_isMiss) { return _haystack[0 .. $]; }
return _haystack.ptr[_offset + 1 .. _haystack.length];
}
bool opCast(T : bool)() const
{
return !_isMiss;
}
private bool _isMiss() const
{
return _haystack.length == _offset;
}
}
foreach (const offset, const ref e; haystack)
{
if (e == needle)
{
return inout(Result)(haystack, offset);
}
}
return inout(Result)(haystack, haystack.length);
}
///
@safe pure nothrow @nogc unittest
{
char[] haystack;
auto r = haystack.findSplitAfter('*');
static assert(is(typeof(r.pre()) == char[]));
static assert(is(typeof(r.post()) == char[]));
}
///
@safe pure nothrow @nogc unittest
{
const(char)[] haystack;
auto r = haystack.findSplitAfter('*');
static assert(is(typeof(r.pre()) == const(char)[]));
static assert(is(typeof(r.post()) == const(char)[]));
}
///
@safe pure nothrow @nogc unittest
{
auto r = "a*b".findSplitAfter('*');
static assert(is(typeof(r.pre()) == string));
static assert(is(typeof(r.post()) == string));
assert(r);
assert(r.pre == "a*");
assert(r.post == "b");
}
More information about the Digitalmars-d-learn
mailing list