[Issue 3384] New: toArray
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Fri Oct 9 10:16:22 PDT 2009
http://d.puremagic.com/issues/show_bug.cgi?id=3384
Summary: toArray
Product: D
Version: 2.033
Platform: Other
OS/Version: Windows
Status: NEW
Keywords: patch
Severity: enhancement
Priority: P2
Component: Phobos
AssignedTo: nobody at puremagic.com
ReportedBy: dsimcha at yahoo.com
--- Comment #0 from David Simcha <dsimcha at yahoo.com> 2009-10-09 10:16:21 PDT ---
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;
}
}
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list