Hmm j'ai ecris ca vite fait, et j'ai oublie les lettres majuscules, oups.. le fix:
static unsigned int s_aVowelLookup[] = { 0, 0, 0x02208222, 0x02208222, 0, 0, 0, 0 };
J'utilise en general ce genre de technique pour faire un premier filtre pour ce qui est nickname/url/clan name/email/etc dans des GUI, mais aussi pour une table de glyphs supportes par un font, etc. L'avantage etant bien entedu aucune comparaison (lent sur console), et une tres petite occupation memoire. Bon un peu plus tricky lorsqu'on travaille en utf-8 cela dit.
Pour ceux qui ont pas suivis (et vu comme ajd j'ai un peu de temps pour poster =), une petite description:
l'idee est d'avoir une fonction qui prend un character et qui renvoi un bool indiquant si le character est une voyelle on non. Donc unsigned char (256 valeurs possibles) -> bool (2 valeurs possibles).
On pourrait faire qqchose du style:
static bool s_abIsVowel[256] = { .... };
bool IsVowel(unsigned char c) { return s_abIsVowel[c]; }
mais ca prends un peu trop de memoire a mon gout, vu que pour un caracter on utilise un bool en memoire, donc 8 bits, la taille d'un char; 256 valeurs au lieu d'une.
L'idee est donc d'utiliser un bit au lieu de 8; on a 32 bits dans un unsigned int, donc ca nous fait plus que 256/32=8 unsigned int (donc un total de 8*4=32 octets a la place de 256).
c >> 5 nous indique l'unsigned int a utiliser, (c & 31) le bit correspondant: on divise l'espace des 256 valeurs en 8 groupes (correspondant au 3 bits de poids forts de c), et chaque sous groupe en 32 (correspondant au 5 bits de poids faibles de c).