about std.string.representation

Ali Çehreli acehreli at yahoo.com
Mon Nov 18 22:11:25 PST 2013


On 11/18/2013 07:48 PM, bioinfornatics wrote:
> On Thursday, 14 November 2013 at 12:01:04 UTC, Ali Çehreli wrote:
>> On 11/13/2013 04:32 PM, bioinfornatics wrote:
>>> Hi,
>>> I try to understand which type char, dchar, wchar will give
>>> ubyte,ushort,uint…
>>
>> And for templates, there is std.range.ElementEncodingType:
>>
>> import std.stdio;
>> import std.range;
>>
>> void foo(R)(R range)
>> {
>>     // In contrast, ElementType!R for strings is always dchar
>>     writeln(typeid(ElementEncodingType!R));
>> }
>>
>> void main()
>> {
>>     string  t  = "test";
>>     char[]  c  = "test".dup;
>>     dchar[] dc = "test"d.dup;
>>     wchar[] wc = "test"w.dup;
>>
>>     foo(t);
>>     foo(c);
>>     foo(dc);
>>     foo(wc);
>> }
>>
>> Prints:
>>
>> immutable(char)
>> char
>> dchar
>> wchar
>>
>> Ali
>
> Thanks Ali that is interesting too …
>
> In same way i would like to know if they are a function wich return
> ubyte, ushort, uint instead of:
>
> - char, dchar, wchar from std.range.ElementEncodingType
> - ubyte[], ushort[], uint[]  from std.string.representation
>
>
> maybe:
>
> foo(T)( string s ){
>      alias T typeof(s.representation[0]);
>>>> }

I don't know an existing function but I think the following is what you 
are looking for:

import std.range;

template NonUtfElementEncodingType(S)
{
     alias ET = ElementEncodingType!S;

     static if (is (ET == char)) {
         alias NonUtfElementEncodingType = ubyte;

     } else static if (is (ET == wchar)) {
         alias NonUtfElementEncodingType = ushort;

     } else static if (is (ET == dchar)) {
         alias NonUtfElementEncodingType = uint;

     } else {
         alias NonUtfElementEncodingType = ET;
     }
}

void main()
{
     alias Foo = NonUtfElementEncodingType!string;
     Foo[] myByteArray;
}

Ali



More information about the Digitalmars-d-learn mailing list