digitalmars.D.learn - derelict-sdl2 automatically stripping the SDL_ prefix from names
- ProgramGamer (29/29) Nov 26 2018 Hi,
- unDEFER (42/42) Nov 28 2018 Hello, as I know allMembers returns members not recursively. If
Hi, I attempted to use a combination of traits and mixins to automatically create aliases of names in SDL2 without the SDL_ prefix for convenience. However, I was only able to achieve this for functions in the module, and not for types nor enum values. How could I go about achieving the desired result? Here is the code I'm using in an intermediate "sdl_stripped" module: import std.regex; import std.array; public import derelict.sdl2.sdl; string StripSDLPrefix() { auto members = [__traits(allMembers, derelict.sdl2.internal)]; foreach(ref member; members) { if (member.length > 4 && member[0..4] == "SDL_") { member = "alias " ~ member[4..$] ~ " = " ~ member ~ ";\n"; } else { member = ""; } } return members.join(); } mixin(StripSDLPrefix()); // I added this to print the list of generated names for debugging purposes. static if (false) { pragma(msg, StripSDLPrefix()); }
Nov 26 2018
Hello, as I know allMembers returns members not recursively. If you want to get really all members you need to make recursive function. In my program I used the next routine to print all members of module: static void allMembersOfModule(string module_name, bool root=false)() { static if (module_name != "object" && module_name != __MODULE__) { mixin("import "~module_name~";"); pragma(msg, module_name~":"); foreach(member; __traits(allMembers, mixin(module_name))) { static if (__traits(compiles, mixin(member)) && (!__traits(compiles, __traits(getProtection, mixin(member))) || __traits(getProtection, mixin(member)) != "private" && __traits(getProtection, mixin(member)) != "package")) pragma(msg, member); } static if (root || module_name == "std.algorithm" || module_name == "std.range") { import std.algorithm.searching: startsWith; foreach(member; __traits(allMembers, mixin(module_name))) { static if (__traits(compiles, mixin(member)) && __traits(compiles, mixin(member).stringof.startsWith("module ")) && mixin(member).stringof.startsWith("module ")) { allMembersOfModule!(member); } } } } } As I know it worked good. Maybe it helps to you also.
Nov 28 2018