On Monday, 10 October 2016 at 03:55:17 UTC, Andrei Alexandrescu wrote:

Oh, forgot to mention: the initial/short path should only check for ASCII, i.e. c < 0x80. -- Andrei

void popFront1(ref char[] s) @trusted pure nothrow {
  immutable c = s[0];
  size_t char_length = 1;
  if (!(c & 0x80)) {
    goto Lend;
  } else {
    import core.bitop;
    uint i = 7u - bsr(~c | 1u);
    import std.algorithm;
    if (i > 6u) goto Lend;
    char_length = min(i, s.length);
  }
  Lend :
  s = s.ptr[char_length .. s.length];
}


This one removes one unnecessary ret.
It will also probably be better for the branch-predictor.

Reply via email to