<div>phobos is lacking nonallocating string manipulation functions.</div><div><br></div>I made these inplace string=>string functions (see unittests):<div><div>----</div><div>auto takeInplace(T)(T a,size_t n)if(is(T==string));</div>
<div>auto slice(T)(T a,size_t u, size_t v)if(is(T==string));<br><div></div></div><div><div>unittest{</div><div><div><span class="Apple-tab-span" style="white-space:pre"> </span>auto a="≈açç√ef";</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>auto b=a.takeInplace(3);</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>assert(b=="≈aç");</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>assert(a.ptr==b.ptr);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>assert(a.takeInplace(10)==a);</div>
<div>}</div></div><div><div>unittest{</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>import std.range;</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>auto a="≈açç√ef";</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>auto b=a.slice(2,6);</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>assert(a.slice(2,6)=="çç√e");</div><div><span class="Apple-tab-span" style="white-space:pre">  </span>assert(a.slice(2,6).ptr==a.slice(2,3).ptr);</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>assert(a.slice(0,a.walkLength) is a);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>import std.exception;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>assertThrown(a.slice(2,8));</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>assertThrown(a.slice(2,1));</div><div>}</div></div><div>----</div></div><div><br></div><div>A)</div><div>would they belong in phobos? which module?</div><div>
<br></div><div>B)</div><div>I'd also like to have an efficient range interface over strings that has reference semantics on 'front' property:</div><div>----</div><div>auto a="≈açç√ef";</div><div>foreach(i, ref ai; a.byElement){</div>
<div>  alias T=typeof(a); //eg:T==char[]</div><div>  alias E=ForEachType!T; //eg: E==char</div><div>  assert(is(typeof(ai) == T)); //ai is same type as a; it's a slice into it</div><div>  if(i==0)</div><div>    assert(ai.ptr == a.ptr);</div>
<div>}</div><div><div>----</div></div><div><br></div><div>This would make it easy for example to implement other non-allocating inplace unicode functions, such as: toUpper:</div><div>auto toUpper(T)(T a){</div><div><div>foreach(i, ref ai; a.byElement){</div>
</div><div>ai[]=<a href="http://ai.toUpper.to">ai.toUpper.to</a>!(typeof(ai)); //throws if some rare character has it's toUpper of different size as its lowercase.</div><div>}</div><div>}</div><div><br></div></div>