The idea behind ## is to help remove complexity, not add it. With good code you shouldn't have to get into the original author's mindset to understand what they are doing.
There wasn't even a comment to explain what was going on.
The code as written meant nothing to me - I could not understand what it was doing, or why you want to do it.
So I ran it though the preprocessor and got this:
Code:
void InitGfxBufEnums()
{
GfxBufTypeEnums[E_BUFF_TYPE_NONE] = "E_BUFF_TYPE_NONE"; ApiBufTypeEnums[E_BUFF_TYPE_NONE] = "0"; ApiBufTypeTypes[E_BUFF_TYPE_NONE] = 0;;
GfxBufTypeEnums[E_BUFF_TYPE_VERTEX] = "E_BUFF_TYPE_VERTEX"; ApiBufTypeEnums[E_BUFF_TYPE_VERTEX] = "GL_ARRAY_BUFFER"; ApiBufTypeTypes[E_BUFF_TYPE_VERTEX] = GL_ARRAY_BUFFER;;
GfxBufTypeEnums[E_BUFF_TYPE_INDICE] = "E_BUFF_TYPE_INDICE"; ApiBufTypeEnums[E_BUFF_TYPE_INDICE] = "GL_ELEMENT_ARRAY_BUFFER"; ApiBufTypeTypes[E_BUFF_TYPE_INDICE] = GL_ELEMENT_ARRAY_BUFFER;;
GfxBufHintEnums[E_BUFF_HINT_DYNAMIC_COPY] = "E_BUFF_HINT_DYNAMIC_COPY"; ApiBufHintEnums[E_BUFF_HINT_DYNAMIC_COPY] = "GL_DYNAMIC_COPY"; ApiBufHintTypes[E_BUFF_HINT_DYNAMIC_COPY] = GL_DYNAMIC_COPY;;
GfxBufHintEnums[E_BUFF_HINT_DYNAMIC_DRAW] = "E_BUFF_HINT_DYNAMIC_DRAW"; ApiBufHintEnums[E_BUFF_HINT_DYNAMIC_DRAW] = "GL_DYNAMIC_DRAW"; ApiBufHintTypes[E_BUFF_HINT_DYNAMIC_DRAW] = GL_DYNAMIC_DRAW;;
GfxBufHintEnums[E_BUFF_HINT_DYNAMIC_READ] = "E_BUFF_HINT_DYNAMIC_READ"; ApiBufHintEnums[E_BUFF_HINT_DYNAMIC_READ] = "GL_DYNAMIC_READ"; ApiBufHintTypes[E_BUFF_HINT_DYNAMIC_READ] = GL_DYNAMIC_READ;;
GfxBufHintEnums[E_BUFF_HINT_FLOWING_COPY] = "E_BUFF_HINT_FLOWING_COPY"; ApiBufHintEnums[E_BUFF_HINT_FLOWING_COPY] = "GL_STREAM_COPY"; ApiBufHintTypes[E_BUFF_HINT_FLOWING_COPY] = GL_STREAM_COPY;;
GfxBufHintEnums[E_BUFF_HINT_FLOWING_DRAW] = "E_BUFF_HINT_FLOWING_DRAW"; ApiBufHintEnums[E_BUFF_HINT_FLOWING_DRAW] = "GL_STREAM_DRAW"; ApiBufHintTypes[E_BUFF_HINT_FLOWING_DRAW] = GL_STREAM_DRAW;;
GfxBufHintEnums[E_BUFF_HINT_FLOWING_READ] = "E_BUFF_HINT_FLOWING_READ"; ApiBufHintEnums[E_BUFF_HINT_FLOWING_READ] = "GL_STREAM_READ"; ApiBufHintTypes[E_BUFF_HINT_FLOWING_READ] = GL_STREAM_READ;;
GfxBufHintEnums[E_BUFF_HINT_LASTING_COPY] = "E_BUFF_HINT_LASTING_COPY"; ApiBufHintEnums[E_BUFF_HINT_LASTING_COPY] = "GL_STATIC_COPY"; ApiBufHintTypes[E_BUFF_HINT_LASTING_COPY] = GL_STATIC_COPY;;
GfxBufHintEnums[E_BUFF_HINT_LASTING_DRAW] = "E_BUFF_HINT_LASTING_DRAW"; ApiBufHintEnums[E_BUFF_HINT_LASTING_DRAW] = "GL_STATIC_DRAW"; ApiBufHintTypes[E_BUFF_HINT_LASTING_DRAW] = GL_STATIC_DRAW;;
GfxBufHintEnums[E_BUFF_HINT_LASTING_READ] = "E_BUFF_HINT_LASTING_READ"; ApiBufHintEnums[E_BUFF_HINT_LASTING_READ] = "GL_STATIC_READ"; ApiBufHintTypes[E_BUFF_HINT_LASTING_READ] = GL_STATIC_READ;;
}
(note the ";;" on the end of lines).
So then I had a look at it and refactored it:
Code:
static inline void AddTypeEnumMapping(int src, char *src_name, int dest, dest_name) {
GfxBufTypeEnums[src] = src_name;
ApiBufTypeEnums[src] = dest_name;
ApiBufTypeTypes[src] = dest;
};
static inline void AddHintEnumMapping(int src, char *src_name, int dest, dest_name) {
GfxBufHintEnums[src] = src_name;
ApiBufHintEnums[src] = dest_name;
ApiBufHintTypes[src] = dest;
};
void InitGfxBufEnums()
{
// Macros to stringyfy enum names to save typing
#define ADD_TYPE(src, dest) AddTypeEnumMapping(src,#src,dest,#dest)
#define ADD_HINT(src, dest) AddHintEnumMapping(src,#src,dest,#dest)
ADD_TYPE(E_BUFF_TYPE_NONE, 0);
ADD_TYPE(E_BUFF_TYPE_VERTEX, GL_ARRAY_BUFFER);
ADD_TYPE(E_BUFF_TYPE_INDICE, GL_ELEMENT_ARRAY_BUFFER);
ADD_HINT(E_BUFF_HINT_DYNAMIC_COPY, GL_DYNAMIC_COPY );
ADD_HINT(E_BUFF_HINT_DYNAMIC_DRAW, GL_DYNAMIC_DRAW );
ADD_HINT(E_BUFF_HINT_DYNAMIC_READ, GL_DYNAMIC_READ );
ADD_HINT(E_BUFF_HINT_FLOWING_COPY, GL_STREAM_COPY );
ADD_HINT(E_BUFF_HINT_FLOWING_DRAW, GL_STREAM_DRAW );
ADD_HINT(E_BUFF_HINT_FLOWING_READ, GL_STREAM_READ );
ADD_HINT(E_BUFF_HINT_LASTING_COPY, GL_STATIC_COPY );
ADD_HINT(E_BUFF_HINT_LASTING_DRAW, GL_STATIC_DRAW );
ADD_HINT(E_BUFF_HINT_LASTING_READ, GL_STATIC_READ );
#undef ADD_TYPE
#undef ADD_HINT
}
This is what comes out of the preprocessor:
Code:
static inline void AddTypeEnumMapping(int src, char *src_name, int dest, dest_name) {
GfxBufTypeEnums[src] = src_name;
ApiBufTypeEnums[src] = dest_name;
ApiBufTypeTypes[src] = dest;
};
static inline void AddHintEnumMapping(int src, char *src_name, int dest, dest_name) {
GfxBufHintEnums[src] = src_name;
ApiBufHintEnums[src] = dest_name;
ApiBufHintTypes[src] = dest;
};
void InitGfxBufEnums()
{
AddTypeEnumMapping(E_BUFF_TYPE_NONE,"E_BUFF_TYPE_NONE",0,"0");
AddTypeEnumMapping(E_BUFF_TYPE_VERTEX,"E_BUFF_TYPE_VERTEX",GL_ARRAY_BUFFER,"GL_ARRAY_BUFFER");
AddTypeEnumMapping(E_BUFF_TYPE_INDICE,"E_BUFF_TYPE_INDICE",GL_ELEMENT_ARRAY_BUFFER,"GL_ELEMENT_ARRAY_BUFFER");
AddHintEnumMapping(E_BUFF_HINT_DYNAMIC_COPY,"E_BUFF_HINT_DYNAMIC_COPY",GL_DYNAMIC_COPY,"GL_DYNAMIC_COPY");
AddHintEnumMapping(E_BUFF_HINT_DYNAMIC_DRAW,"E_BUFF_HINT_DYNAMIC_DRAW",GL_DYNAMIC_DRAW,"GL_DYNAMIC_DRAW");
AddHintEnumMapping(E_BUFF_HINT_DYNAMIC_READ,"E_BUFF_HINT_DYNAMIC_READ",GL_DYNAMIC_READ,"GL_DYNAMIC_READ");
AddHintEnumMapping(E_BUFF_HINT_FLOWING_COPY,"E_BUFF_HINT_FLOWING_COPY",GL_STREAM_COPY,"GL_STREAM_COPY");
AddHintEnumMapping(E_BUFF_HINT_FLOWING_DRAW,"E_BUFF_HINT_FLOWING_DRAW",GL_STREAM_DRAW,"GL_STREAM_DRAW");
AddHintEnumMapping(E_BUFF_HINT_FLOWING_READ,"E_BUFF_HINT_FLOWING_READ",GL_STREAM_READ,"GL_STREAM_READ");
AddHintEnumMapping(E_BUFF_HINT_LASTING_COPY,"E_BUFF_HINT_LASTING_COPY",GL_STATIC_COPY,"GL_STATIC_COPY");
AddHintEnumMapping(E_BUFF_HINT_LASTING_DRAW,"E_BUFF_HINT_LASTING_DRAW",GL_STATIC_DRAW,"GL_STATIC_DRAW");
AddHintEnumMapping(E_BUFF_HINT_LASTING_READ,"E_BUFF_HINT_LASTING_READ",GL_STATIC_READ,"GL_STATIC_READ");
}
I'll leave it up to yourself and others do discuss which is better and why, but found the original unintelligible.