about std.string.representation

bioinfornatics bioinfornatics at fedoraproject.org
Tue Nov 19 15:53:32 PST 2013


On Tuesday, 19 November 2013 at 06:11:26 UTC, Ali Çehreli wrote:
> 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

Yes that is what i want. whyu not to use a piece of code from 
std.string.representation ?

auto CharEncodingType(Char)(Char[] s) pure nothrow
     if(isSomeChar!Char)
{
     // Get representation type
     alias TypeTuple!(ubyte, ushort, uint)U;

     // const and immutable storage classes
     static if (is(Char == immutable)) alias immutable(U) T;
     else static if (is(Char == const)) alias const(U) T;
     else alias U T;

     // shared storage class (because shared(const(T)) is possible)
     static if (is(Char == shared)) alias shared(T) ST;
     else alias T ST;

     return cast(ST) s;
}


More information about the Digitalmars-d-learn mailing list