Should be easy

Saaa empty at needmail.com
Fri Jun 12 11:21:40 PDT 2009


Thanks!
I thought about the idea of just creating the code and mix it in, but now I 
can see why I failed at that: Your code is kind of read-only to me, for now, 
because I need to change it a bit to accept an array instead of seperat 
indices.

Wouldn't it be nice if it worked like this:
int[] index = (1,2,3);
array(index) = -1;

>
> Here's one.
>
> module test144;
>
> import std.stdio, std.metastrings;
>
> struct PointerAssign(T) {
>  T* ptr;
>  T opAssign(T t) { *ptr = t; return t; }
>  static PointerAssign opCall(T* p) { PointerAssign res; res.ptr = p; 
> return res; }
> }
>
> template isArray(T: T[]) { const bool isArray = true; }
> template isArray(T) { const bool isArray = false; }
>
> template Init(T) { const T Init; }
> template ElemType(T) { alias typeof(Init!(T)[0]) ElemType; }
>
> template BaseType(T) {
>  static if (isArray!(T)) alias BaseType!(ElemType!(T)) BaseType;
>  else alias T BaseType;
> }
>
> template Depth(T) {
>  static if (isArray!(T)) const int Depth = 1 + Depth!(ElemType!(T));
>  else const int Depth = 0;
> }
>
> string ctToString(int i) {
>  if (!i) return "0";
>  string res;
>  while (i) {
>    res = "0123456789"[i%10] ~ res;
>    i /= 10;
>  }
>  return res;
> }
>
> string index(int len) {
>  string res;
>  for (int i = 0; i < len; ++i)
>    res ~= "[indices["~ctToString(i)~"]] ";
>  return res;
> }
>
> PointerAssign!(BaseType!(T)) IndexArray(T)(T array, int[] indices...) {
>  return PointerAssign!(BaseType!(T)) (mixin("&array"~index(Depth!(T))));
> }
>
> void main() {
>  int[][][] array;
>  array.length = 10;
>  array[1].length = 3;
>  array[1][2].length = 4;
>  array[1][2][1] = 99;
>  writefln(array);
>  IndexArray(array, 1, 2, 3) = -1;
>  writefln(array);
> } 




More information about the Digitalmars-d-learn mailing list