splitterASCII

Non-decoding ASCII-separator-only variant of Phobos' splitter.

@trusted
splitterASCII
(
alias separatorPred
Range
)
(
return Range r
)
if (
is(typeof(Range.init[0 .. 0])) &&
is(typeof(Range.init[0]) : char)
&&
is(typeof(separatorPred(char.init)) : bool)
)

Examples

import std.algorithm.comparison : equal;
import std.algorithm.comparison : among;
import nxt.array_help : s;

assert(``.splitterASCII!(_ => _ == ' ')
         .empty);

assert(` `.splitterASCII!(_ => _ == ' ')
          .empty);

assert(`   `.splitterASCII!(_ => _ == ' ')
            .empty);

assert(` - `.splitterASCII!(_ => _ == ' ')
            .equal([`-`].s[]));

assert(`a`.splitterASCII!(_ => _ == ' ')
          .equal([`a`].s[]));

assert(` a `.splitterASCII!(_ => _ == ' ')
            .equal([`a`].s[]));

assert(` a b `.splitterASCII!(_ => _ == ' ')
              .equal([`a`, `b`].s[]));

assert(` a_b `.splitterASCII!(_ => _ == ' ')
              .equal([`a_b`].s[]));

assert(` - aa   bb--c-_d--_e`.splitterASCII!(_ => _.among!(' ', '-', '_') != 0)
                             .equal([`aa`, `bb`, `c`, `d`, `e`].s[]));

DIP-1000 return ref escape analysis

import nxt.dip_traits : isDIP1000;

static if (isDIP1000)
{
    // See_Also: https://forum.dlang.org/post/pzddsrwhfvcopfaamvak@forum.dlang.org
    static assert(!__traits(compiles, {
                char[] f()
                {
                    char[2] x;
                    return x[].splitterASCII!(_ => _ == ' ').front;
                }
            }));
}

Meta