Saaa wrote:
Ary Borenszweig wrote:
Saaa wrote:
public void addToAA(char[] var_name, KT, ET)(KT key, ET element)
{
  mixin(ET.stringof~`[]* elements = key in `~var_name~`;`);
  if( elements == null )
  {
    ET[] temp;
    temp.length = 1;
    temp[0] = element;
    mixin(var_name~`[key] = temp;`);
Why `key`? Where's `key` defined?
Here: ...(KT key, ET element)
  }
  else
  {
    (*elements).length = (*elements).length + 1;
    (*elements)[(*elements).length-1] = element;
I don't understand this. Key is not used.
That's because there is already a link to the key through elements.

  }
}
And how do you use it? I tried to but I failed.
You need a AA defined like this:
BaseType[][KeyType] AAname;

addToAA!("AAname")(KeyType key, BaseType value);

Also passing a string as var_name is not nice. Isn't it better to write something like:

char[int] x;
x.add(1, 'h');

?

The string is the actual variable name so I think that way doesn't work, right?

Check the new version(shorter)  in my other reply :D



This worked just now with DMD 2.035:

////////////////////////////// BEGIN CODE
module test1;

import std .stdio ;

public void add ( AAA : E[][K], K, E ) ( ref AAA aa, K key, E[] elem ... ) {
    if ( auto ptr = key in aa ) {
        *ptr ~= elem;
    }
    else {
        aa[ key ] = elem;
    }
}

void main () {
    int[][ char ] sandbox ;

    sandbox.add( 'a', 1 );
    sandbox.add( 'b', 1, 2 );
    sandbox.add( 'c', 1 );
    sandbox.add( 'a', 2, 3 );

    foreach ( key, elems ; sandbox ) {
        writeln(`    [`, key, `] `, elems);
    }
}
////////////////////////////// END CODE

-- Chris Nicholson-Sauls

Reply via email to