http://d.puremagic.com/issues/show_bug.cgi?id=7753
Dmitry Olshansky <[email protected]> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |[email protected] --- Comment #1 from Dmitry Olshansky <[email protected]> 2012-03-23 03:28:52 PDT --- It might be a good thing, but ... Why not just return a proxy type upon each indexing? The proxy type will have createIndex that will forward to others in turn. Here a prof of concept I belive it could be generalized and polished. For simplicity sake it's for n-dim arrays: import std.stdio, std.exception; struct Proxy(T) { T* _this; int idx; void opAssign(X)(X value){ debug writeln("Proxy.opAssign"); createIndex(idx) = value; } static if(typeof(*_this).dimension >= 2) { // somewhere io expression ...a[idx][jdx]... is create all, except last one auto opIndex(int jdx){ return proxy(&_this.createIndex(idx), jdx); } //a[idx][jdx] = y; is create if non-existent auto opIndexAssign(X)(X val, int jdx){ //TODO: constraints! debug writeln("Proxy.opIndexAssign"); _this.createIndex(idx).createIndex(jdx) = val; } } @property ref expr(){ debug writeln("Proxy.expr"); return _this.normalIndex(idx); } alias expr this; } auto proxy(T)(T* x, int idx){ return Proxy!(T)(x,idx); } struct M(size_t dim) { static if(dim == 1){ alias int Val; } else{ alias M!(dim-1) Val; } enum dimension = dim; Val[] arr; ref createIndex(int idx){ debug writeln("Created ", typeof(this).stringof); if(arr.length < idx) arr.length = idx+1; return arr[idx]; } ref normalIndex(int idx){ debug writeln("Indexed ", typeof(this).stringof); return arr[idx]; } auto opIndex(int idx){ return Proxy!(M)(&this, idx); } alias arr this; } unittest{ M!(3) d3arr; d3arr[1][2] = [2, 3, 4]; assert(d3arr[1][2][2] == 4); int[] x = d3arr[1][2]; assert(d3arr[1][2].length == 3); assert(d3arr[1][1] == null); //inited //booom used before explicit = assert(collectException!Error(d3arr[2][2][1] + 1 == 1) !is null); } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
