October 17, 2017
https://issues.dlang.org/show_bug.cgi?id=17905

          Issue ID: 17905
           Summary: byCodeUnit should allow access to underlying range
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: phobos
          Assignee: nobody@puremagic.com
          Reporter: issues.dlang@jmdavisProg.com

In general, when a range is wrapped in another range, you can't get access to the original range, and that makes sense, because the resulting range is transforming the underlying range such that it would usually cause problems if you could get at the underlying range. However, there are cases where it's a serious problem that you can't get at the underlying range. In particular, it seriously hampers byCodeUnit.

The main purpose of byCodeUnit is to wrap narrow strings so that they're not autodecoded, and they're treated as random access ranges of code units. Of course, it also works on other ranges of charaters, but just returns those. And if you're simply consuming the string, that's not a big deal. However, there are plenty of cases where you want to feed a string into a function which would normally trigger autodecoding, which you don't want, so you use byCodeUnit, but you don't want the range's type to change (and it wouldn't need to save for auto-decoding). So, you need to use byCodeUnit to treat the string as a range of code units, but using byCodeUnit traps the string in another range.

So, I propose that we add a source property to byCodeUnit so that it's possible to pass a string to a function which would normally auto-decode, have it treat the string as a range of code units instead, and get whatever is left of the string back out again from what the function returns. Then using byCodeUnit doesn't mean that the string is permanently trapped.

--