I did something similar some time ago:

import std.stdio;

struct EnumDescription
{
  char[] name;
  char[] description;
};

//
// generates an enum, an associated string table and a "save" lookup
// function which determines the string which belongs to an given enum
//
char[] generate_enum(char[] enumname, EnumDescription[] list)
{
  // create enum declaration
  char result[] = "enum " ~ enumname ~ "{";
  foreach(entry; list)
  {
    result ~= entry.name ~ ",";
  }
  result ~= "};";

  // create description array
result ~= `private static char[][` ~ enumname ~ `.max + 1] s_` ~ enumname ~ `ToString =
[`;
  foreach(entry; list)
  {
result ~= enumname ~ "." ~ entry.name ~ ` : "` ~ entry.description ~ `",`;
  }
  result ~= "];";

  // create save "toString" function
  result ~= `static char[] ` ~ enumname ~ `ToString(` ~ enumname ~ ` type)
{
  if (type <= ` ~ enumname ~ `.max)
  {
    return s_` ~ enumname ~ `ToString[type];
  }
  return "<invalid enum, no description available>";
}`;

  return result;
}

const EnumDescription[] ErrorList =
[
  { "INTERNAL_ERROR"       , "internal error" },
  { "ALLOCATION_ERROR"     , "allocation error" },
  { "INTEGER_EXPECTED"     , "integer expected" },
];

mixin(generate_enum("ErrorType", ErrorList));


void main()
{
writefln(ErrorType.ALLOCATION_ERROR, " : ", ErrorTypeToString(ErrorType.ALLOCATION_ERROR));
}


Greets

KlausO



Walter Bright schrieb:
http://www.drdobbs.com/blog/archives/2010/06/the_x_macro.html

Even though D doesn't have a text macro preprocessor, this can be done using string mixins and a bit of CTFE.

Reply via email to