Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
February 18, 2013 [Issue 9528] New: std.array.appender can't append elements with const members | ||||
---|---|---|---|---|
| ||||
http://d.puremagic.com/issues/show_bug.cgi?id=9528 Summary: std.array.appender can't append elements with const members Product: D Version: D2 Platform: All OS/Version: All Status: NEW Severity: normal Priority: P2 Component: Phobos AssignedTo: nobody@puremagic.com ReportedBy: hsteoh@quickfur.ath.cx --- Comment #0 from hsteoh@quickfur.ath.cx 2013-02-17 17:37:08 PST --- Code: ------------------------------------------ import std.array; E[] fastCopy(E)(E[] src) { auto app = appender!(const(E)[])(); foreach (i, e; src) app.put(e); return app.data; } E[] slowCopy(E)(E[] src) { E[] result; foreach (i, e; src) result ~= e; return result; } void main() { class C {} struct S { const(C) c; } S[] s = [ S(new C) ]; //auto t = fastCopy(s); // Does not compile auto t = slowCopy(s); } ------------------------------------------ If fastCopy is used in place of slowCopy, dmd git head gives: ------------------------------------------ /usr/src/d/phobos/std/array.d(2256): Error: cannot modify struct (cast(S*)(*this._data).arr)[len] S with immutable members test.d(6): Error: template instance std.array.Appender!(const(S)[]).Appender.put!(S) error instantiating test.d(22): instantiated from here: fastCopy!(S) test.d(7): Error: cannot implicitly convert expression (app.data()) of type const(S)[] to S[] test.d(22): Error: template instance test.fastCopy!(S) error instantiating ------------------------------------------ Is there any workaround for this? What I'm trying to accomplish is to copy an array of elements with const fields, but selectively skip elements based on some predicate (so straight .dup is out of the question). But using =~ is slow because of continual resizing/reallocation. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
March 08, 2013 [Issue 9528] std.array.appender can't append elements with const members | ||||
---|---|---|---|---|
| ||||
Posted in reply to hsteoh@quickfur.ath.cx | http://d.puremagic.com/issues/show_bug.cgi?id=9528 monarchdodra@gmail.com changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |rswhite4@googlemail.com --- Comment #1 from monarchdodra@gmail.com 2013-03-08 11:27:46 PST --- *** Issue 9667 has been marked as a duplicate of this issue. *** -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
March 08, 2013 [Issue 9528] std.array.appender can't append elements with const members | ||||
---|---|---|---|---|
| ||||
Posted in reply to hsteoh@quickfur.ath.cx | http://d.puremagic.com/issues/show_bug.cgi?id=9528 monarchdodra@gmail.com changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |monarchdodra@gmail.com --- Comment #2 from monarchdodra@gmail.com 2013-03-08 11:34:58 PST --- The problem is that appender is making the double assuption that unqual implies assignability, and that copyiable implies assignability (empace ony requires copyability). Finally, it makes the wrong assumption that you can call opAssign on something that is not yet initialized (append makes raw allocations). Amongst a few other bugs mind you. There is a lot of broken in appender that I've tried to fix before, but it is very tricky because: 1) It is a ritical function that is used for strings, and needs to support CTFE. 2) Anything that fixes emplace must not slow it down. 3) It should be calling emplace instead of opAssign but emplace is currently broken for exactly the same reasons! I should maybe try to fix it in smaller incremental steps, but it is very hard to knowingly deliver code that you know is broken, and know how to fix. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
March 10, 2013 [Issue 9528] std.array.appender can't append elements with const members | ||||
---|---|---|---|---|
| ||||
Posted in reply to hsteoh@quickfur.ath.cx | http://d.puremagic.com/issues/show_bug.cgi?id=9528 --- Comment #3 from rswhite4@googlemail.com 2013-03-10 05:38:51 PDT --- (In reply to comment #2) > The problem is that appender is making the double assuption that unqual implies assignability, and that copyiable implies assignability (empace ony requires copyability). Finally, it makes the wrong assumption that you can call opAssign on something that is not yet initialized (append makes raw allocations). Amongst a few other bugs mind you. > > There is a lot of broken in appender that I've tried to fix before, but it is > very tricky because: > 1) It is a ritical function that is used for strings, and needs to support > CTFE. > 2) Anything that fixes emplace must not slow it down. > 3) It should be calling emplace instead of opAssign but emplace is currently > broken for exactly the same reasons! > > I should maybe try to fix it in smaller incremental steps, but it is very hard to knowingly deliver code that you know is broken, and know how to fix. Possible solution for this: static if (__traits(compiles, { _data.arr.ptr[len] = cast(Unqual!T) item; })) { _data.arr.ptr[len] = cast(Unqual!T) item; } else { memcpy(&_data.arr.ptr[len], cast(Unqual!(T)*) &item, T.sizeof); } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
August 28, 2013 [Issue 9528] std.array.appender can't append elements with const members | ||||
---|---|---|---|---|
| ||||
Posted in reply to hsteoh@quickfur.ath.cx | http://d.puremagic.com/issues/show_bug.cgi?id=9528 monarchdodra@gmail.com changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |bearophile_hugs@eml.cc --- Comment #4 from monarchdodra@gmail.com 2013-08-28 02:17:48 PDT --- *** Issue 10753 has been marked as a duplicate of this issue. *** -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
August 28, 2013 [Issue 9528] std.array.appender can't append elements with const members | ||||
---|---|---|---|---|
| ||||
Posted in reply to hsteoh@quickfur.ath.cx | http://d.puremagic.com/issues/show_bug.cgi?id=9528 --- Comment #5 from monarchdodra@gmail.com 2013-08-28 08:30:16 PDT --- https://github.com/D-Programming-Language/phobos/pull/1529 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
Copyright © 1999-2021 by the D Language Foundation