www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 5379] New: std.array.replace fails on char[]s

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5379

           Summary: std.array.replace fails on char[]s
           Product: D
           Version: D2
          Platform: x86
        OS/Version: Mac OS X
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Phobos
        AssignedTo: nobody puremagic.com
        ReportedBy: oag optusnet.com.au



PST ---
import std.stdio;
import std.array;

void main() {
    char[] s = "abcdef".dup;
    char[] t = "xxxx".dup;
    replace(s, 2, 4, t);
    writefln("s = %s", s);
}

/+
Gives me the following compile error:

mymble:d oag$ dmd replace.d 
replace.d(7): Error: template std.array.replace(T,Range) if
(is(ElementType!(Range) == T)) does not match any function template declaration
replace.d(7): Error: template std.array.replace(T,Range) if
(is(ElementType!(Range) == T)) cannot deduce template function from argument
types !()(char[],int,int,char[])

It appears to think that ElementType!(char[]) is dchar.
+/

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Dec 27 2010
parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5379


Lars T. Kyllingstad <bugzilla kyllingen.net> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
                 CC|                            |bugzilla kyllingen.net
         Resolution|                            |WONTFIX



05:55:54 PST ---
The thing is, char[] is assumed to be UTF-8 encoded, which means that one array
element doesn't necessarily correspond to one symbol (or, more precisely, one
code point may be composed of several code units).  That's why (from a range
point of view) the element type of char[] is dchar, which is UTF-32 encoded, or
"decoded" in the sense that one element is one symbol.

Here's an example to prove the point:

  char[] foo = "�ngstr�m";
  replace(foo, 0, 1, "a");

If this were allowed, foo would not contain "angstr�m" as one may expect, it
would contain garbage.  This is because the first character, "�", spans two
array elements.

You have two options:

1. If you want to use std.array.replace() like this with character arrays, you
should use dchar[].

2. Use std.string.replace(), which works with strings but always allocates.


I am closing this as WONTFIX.  There are several people who disagree with dchar
being the range element type of char[], however, so feel free to reopen as an
enhancement request if you wish.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jan 03 2011