Thread overview
Mixed aggregates
Sep 22, 2004
Nigel Sandever
Sep 22, 2004
Ben Hinkle
Sep 22, 2004
Deja Augustine
September 22, 2004
I am trying to get to grips with D and one of the first things I found myself wanting is a command line processing module. Usual thing; scans the input args and produces a data structure that contains them.

Using an associative array to contain the parsed args seems logical. The rest of the program can refer to them by name. The problem is how to construct an AA that hold a mix of data types? Strings; ints; floats; ranges etc.

I came up with

	void *[ char[] ] config;

but that gets very messy when trying to use the data. Requiring (sometimes nonintuative) casting to access to the data.

Anyone got a better way?

Thanks. njs.


September 22, 2004
Nigel Sandever wrote:

> I am trying to get to grips with D and one of the first things I found myself wanting is a command line processing module. Usual thing; scans the input args and produces a data structure that contains them.
> 
> Using an associative array to contain the parsed args seems logical. The rest of the program can refer to them by name. The problem is how to construct an AA that hold a mix of data types? Strings; ints; floats; ranges etc.
> 
> I came up with
> 
> void *[ char[] ] config;
> 
> but that gets very messy when trying to use the data. Requiring (sometimes nonintuative) casting to access to the data.
> 
> Anyone got a better way?
> 
> Thanks. njs.

You might want to try using one of the Variant data types that people have written (though it would probably also involve cast-like syntax). I don't have any links off the top of my head but searching the ng should turn some up.

Another option is to somehow use structures instead of an associative array. The set of options for a program won't change during run-time so a structure could hold all the options. The cmd line processing code will need info about the struct but at least that is done in one place and not every time an option is accessed. An AA that contains mixed data will always require some casting at lookup time.

-Ben
September 22, 2004
You can always just use a struct & union combo:

struct CmdLineArg
{
 int datatype; // this stores what type of data it is
 union data    // this stores the actual data in a compacted format
 {
  float     f;
  int       i;
  char[255] s;
  ...
 }
}

CmdLineArg[ char[] ] config;

Since you treat different types of data differently, it's probably not that much of an impact to check the datatype before accessing the data and it would allow you to catch type mismatches pretty easily:

if(config["TheKey"].datatype == FloatType)
  blah = config["TheKey"].data.f;
else
  error("Floating point number expected");

-Deja

Nigel Sandever wrote:

> I am trying to get to grips with D and one of the first things I found myself wanting is a command line processing module. Usual thing; scans the input args and produces a data structure that contains them. 
> 
> Using an associative array to contain the parsed args seems logical. The rest of the program can refer to them by name. The problem is how to construct an AA that hold a mix of data types? Strings; ints; floats; ranges etc.
> 
> I came up with 	
> 	void *[ char[] ] config;
> 
> but that gets very messy when trying to use the data. Requiring (sometimes nonintuative) casting to access to the data.
> 
> Anyone got a better way?
> 
> Thanks. njs.
> 
>