www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - nonallocating unicode string manipulations

phobos is lacking nonallocating string manipulation functions.

I made these inplace string=3D>string functions (see unittests):
----
auto takeInplace(T)(T a,size_t n)if(is(T=3D=3Dstring));
auto slice(T)(T a,size_t u, size_t v)if(is(T=3D=3Dstring));
unittest{
auto a=3D"=E2=89=88a=C3=A7=C3=A7=E2=88=9Aef";
auto b=3Da.takeInplace(3);
assert(b=3D=3D"=E2=89=88a=C3=A7");
assert(a.ptr=3D=3Db.ptr);
assert(a.takeInplace(10)=3D=3Da);
}
unittest{
import std.range;
auto a=3D"=E2=89=88a=C3=A7=C3=A7=E2=88=9Aef";
auto b=3Da.slice(2,6);
assert(a.slice(2,6)=3D=3D"=C3=A7=C3=A7=E2=88=9Ae");
assert(a.slice(2,6).ptr=3D=3Da.slice(2,3).ptr);
assert(a.slice(0,a.walkLength) is a);
import std.exception;
assertThrown(a.slice(2,8));
assertThrown(a.slice(2,1));
}
----

A)
would they belong in phobos? which module?

B)
I'd also like to have an efficient range interface over strings that has
reference semantics on 'front' property:
----
auto a=3D"=E2=89=88a=C3=A7=C3=A7=E2=88=9Aef";
foreach(i, ref ai; a.byElement){
  alias T=3Dtypeof(a); //eg:T=3D=3Dchar[]
  alias E=3DForEachType!T; //eg: E=3D=3Dchar
  assert(is(typeof(ai) =3D=3D T)); //ai is same type as a; it's a slice int=
o it
  if(i=3D=3D0)
    assert(ai.ptr =3D=3D a.ptr);
}
----

This would make it easy for example to implement other non-allocating
inplace unicode functions, such as: toUpper:
auto toUpper(T)(T a){
foreach(i, ref ai; a.byElement){
ai[]=3Dai.toUpper.to!(typeof(ai)); //throws if some rare character has it's
toUpper of different size as its lowercase.
}
}
Jul 16 2013