Bug 3384 – toArray

Status
RESOLVED
Resolution
FIXED
Severity
enhancement
Priority
P2
Component
phobos
Product
D
Version
D2
Platform
Other
OS
Windows
Creation time
2009-10-09T10:16:00Z
Last change time
2015-06-09T01:29:41Z
Keywords
patch
Assigned to
andrei
Creator
dsimcha

Comments

Comment #0 by dsimcha — 2009-10-09T10:16:21Z
Phobos needs an easy, efficient way of converting an arbitrary finite range into an array, for example to allow for eager evaluation. Below is a proposed solution. It relies on the existence of newVoid(). (See Bugzilla 3383.) /**Converts any range to an array on the GC heap by the most efficient means * available. If it is already an array, duplicates the range.*/ Unqual!(ElementType!(T))[] toArray(T)(T range) if(isInputRange!(T)) { static if(isArray!(T)) { // Allow fast copying by assuming that the input is an array. return range.dup; } else static if(hasLength!(T)) { // Preallocate array, then copy. auto ret = newVoid!(Unqual!(ElementType!(T)))(range.length); static if(is(typeof(ret[] = range[]))) { ret[] = range[]; } else { size_t pos = 0; foreach(elem; range) { ret[pos++] = elem; } } return ret; } else { // Don't have length, have to use appending. Unqual!(ElementType!(T))[] ret; auto app = appender(&ret); foreach(elem; range) { app.put(elem); } return ret; } }
Comment #1 by dsimcha — 2009-11-19T19:43:42Z
I was looking through std.array for unrelated reasons and noticed that there is an array() function already in there. I have no idea when that was added, but it solves this bug.
Comment #2 by andrei — 2009-11-19T20:07:28Z
Thanks!