On 3/29/23 12:21, ag0aep6g wrote: > As far as I understand, you're saying that we cannot overload on `ref`. > But we can. Salih's code demonstrates just that. > > void f(ref int x) {} > void f(int x) {} > void main() { int x; f(x); f(42); } /* no errors */
I thought Salih was proposing two more overloads to the existing put(). When I copy the existing put(), which takes 'ref R', not R[], then the code does not compile:
auto put(R)(R[] range, R[] source) => putImpl(range, source); auto put(R)(ref R[] range, R[] source) => putImpl(range, source); void putImpl(R)(ref R[] range, R[] source) { assert(source.length <= range.length); foreach(element; source) { range[0] = element; // range.front() range = range[1..$]; // range.popFront() } } void put(R, E)(ref R r, E e) { // This is from Phobos <------- } void main() { enum data = [1, 0, 0, 4]; auto arr = data; auto slice = arr[1..$-1]; slice.put([2]); // <-- ERROR assert(arr == [1, 2, 0, 4]); slice.put([3]); assert(arr == [1, 2, 3, 4]); arr[1..$-1].put([0, 0]); assert(arr == data); } Ali