digitalmars.D.bugs - [Issue 4114] New: Support static arrays in some algorithms
- d-bugmail puremagic.com (48/48) Apr 21 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4114
- d-bugmail puremagic.com (23/23) Aug 16 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4114
- d-bugmail puremagic.com (15/15) Aug 17 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4114
- d-bugmail puremagic.com (29/29) Aug 14 2011 http://d.puremagic.com/issues/show_bug.cgi?id=4114
http://d.puremagic.com/issues/show_bug.cgi?id=4114 Summary: Support static arrays in some algorithms Product: D Version: future Platform: All OS/Version: All Status: NEW Keywords: patch Severity: normal Priority: P2 Component: Phobos AssignedTo: nobody puremagic.com ReportedBy: bearophile_hugs eml.cc Fixed-sized stack-allocated static arrays can't support all features of a dynamic array, so they are not a fully flexible range. So it's not possible to perform some operations/algorithms on static arrays. But there are several basic operations that I might desire to perform on static arrays too, like to test if their items are sorted (isSorted), to sort them (sort()), or to compare the items of a sequence to the items of a static array (equals). Currently std.algorithm.isSorted doesn't work with static arrays, but I see no point in forbidding isSorted() or sort() on a static array. A simple workaround is to use: isSorted(stat_arr[]) sort(stat_arr[]) to give isSorted a dynamic array view of the same contents of the static array. This is not too much bad looking, but it gratuitously breaks some generic code. This shows a possible simple way to fix it: to rename the current isSorted as isSorted_impl, and add this function template that uses isSorted_impl: import std.algorithm: isSorted_impl = isSorted; bool isSorted(alias less="a < b", Range)(Range data) if (__traits(isStaticArray, Range) || isForwardRange!Range) { static if (__traits(isStaticArray, Range)) return isSorted_impl!(less)(data[]); else return isSorted_impl!(less)(data); } void main() { int[3] b = [1, 2, 3]; assert(isSorted(b)); } Better, the original isSorted() can become a function statically nested in this wrapper. std.range.array, equal() and sort() can be augmented in similar ways. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Apr 21 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4114 David Simcha <dsimcha yahoo.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |dsimcha yahoo.com The issue I see here is that, since static arrays are usually stack allocated, using them as ranges is inherently unsafe. Even in cases where it seems safe, the predicate may do weird things like escape the static array. I think the generic programming issue can be solved by simply having an unsafe function in std.range: auto toRange(R)(ref R stuff) if(isInputRange!R) { static if(isStaticArray!R) { return stuff[]; } else { return stuff; } } Of course, I'd also create an overload w/o the ref so it works with rvalues. Sound good? -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Aug 16 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4114 In my code I use fixed-sized arrays when possible because heap allocations are slow. What I'd like is that some operations, like the sorts, counts, searches, tests like isSorted, and few other operations, to just work with fixed-sized arrays too. I don't think that performing a isSorted() on a fixed-sized array is an unsafe operation, so I don't agree with you. If you, Andrei (and Brad Roberts) are not interested in this, then you may close this enhancement request. Regarding that toRange() I am not sure if it's a worth addition for Phobos2, you may ask other people. Thank you for your work on Phobos2. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Aug 17 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4114 Jonathan M Davis <jmdavisProg gmx.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED CC| |jmdavisProg gmx.com Resolution| |WONTFIX PDT --- Slicing static arrays works. In some cases, there may be issues, but in most cases, it works. Most range-based functions don't alter the original range in manner which would be of any risk to static arrays. Predicates don't usually escape anything either. It would be a _highly_ abnormal predicate which did, and I'd be worried about any predicate which did. Predicates for std.algorithm functions are generally assumed not to have state which changes and usually won't work right if they do. The greatest risk is if you try and return a range from a range-based function which you passed a static array to. _That_ risks leaks, but the programmer is just going to have to be careful about that. There's no way to disallow the use of dynamic arrays which point to static arrays. Creating overloads for static arrays would result in needlessly copying them (since static arrays are value types), and would further clutter std.algorithm, increasing its maintenance cost. We're just not going to do anything which treats static arrays special in order to work with range-based functions. If you want to use a static array with a range-base function, then slice it and be sure that you don't let the resulting range escape the scope of the static array. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Aug 14 2011