История изменений
Исправление beastie, (текущая версия) :
Эту пьянку можно и продолжить:
struct entry {
int index,
char *telNo,
char *name,
}
int caseTel(struct entry *e) { /* только телефон */ }
int caseTelName(struct entry *e) { /* телефон и имя */ }
int caseIdx(struct entry *e) { /* только индекс */ }
int caseIdxTel(struct entry *e) { /* индекс и телефон */ }
int caseIdxTelName(struct entry *e) { /* индекс, телефон и имя */ }
enum { IDX, TEL, NAME, MAX };
int (*cases)()[1<<MAX] = {
[1<<TEL]: caseTel,
[1<<TEL | 1<<NAME]: caseTelName,
[1<<IDX]: caseIdx,
[1<<IDX | 1<<TEL]: caseIdxTel,
[1<<IDX | 1<<TEL | <<NAME]: caseIdxTelName,
};
int check(struct entry *e) {
int cond = (e->index >= 0) << IDX |
(!! e->telNo) << TEL |
(!! e->name) << NAME;
int (*f)() = cases[cond && ((1<<MAX) - 1)];
if !f {
//недопустимое сочетание
return -1;
}
return f(e)
}
Исходная версия beastie, :
Эту пьянку можно и продолжить:
int caseTel(struct entry *e) { /* только телефон */ }
int caseTelName(struct entry *e) { /* телефон и имя */ }
int caseIdx(struct entry *e) { /* только индекс */ }
int caseIdxTel(struct entry *e) { /* индекс и телефон */ }
int caseIdxTelName(struct entry *e) { /* индекс, телефон и имя */ }
struct entry {
int index,
char *telNo,
char *name,
}
enum { IDX, TEL, NAME, MAX };
int (*cases)()[1<<MAX] = {
[1<<TEL]: caseTel,
[1<<TEL | 1<<NAME]: caseTelName,
[1<<IDX]: caseIdx,
[1<<IDX | 1<<TEL]: caseIdxTel,
[1<<IDX | 1<<TEL | <<NAME]: caseIdxTelName,
};
int check(struct entry *e) {
int cond = (e->index >= 0) << IDX |
(!! e->telNo) << TEL |
(!! e->name) << NAME;
int (*f)() = cases[cond && ((1<<MAX) - 1)];
if !f {
//недопустимое сочетание
return -1;
}
return f(e)
}