diff options
author | Neil Moore <neil@s-z.org> | 2014-06-27 00:30:40 -0400 |
---|---|---|
committer | Neil Moore <neil@s-z.org> | 2014-06-27 01:04:43 -0400 |
commit | 885142fd33fe406429db32dc383ab3ec09878740 (patch) | |
tree | 7933d07c3af22153084df82acdf8dfcfe3fc5143 /crawl-ref/source/dbg-scan.cc | |
parent | 933cb4062d48c9c5a39a99b0703d00598fc46dc7 (diff) | |
download | crawl-ref-885142fd33fe406429db32dc383ab3ec09878740.tar.gz crawl-ref-885142fd33fe406429db32dc383ab3ec09878740.zip |
Simplify and improve some initialization macros.
Make SET_FIELDS safer by using a do { } while(0) block, which also gives
us a scope, so we don't have to take the name of the intermediate array
variable as a parameter. Rename it to INIT_VEC (it only works on
vectors of strings, but whatever). While we're at it, also make sure
we evaluate the argument only once. Also, use an array of const char *s
instead of strings, make that array static and const, and use the
ARRAYSZ macro.
Then, replace most of the uses of INIT_VEC née SET_FIELDS with a wrapper
macro ITEM_FILEDS that shortens things a bit.
Finally, move the macro definiton outside the function, and reformat.
Diffstat (limited to 'crawl-ref/source/dbg-scan.cc')
-rw-r--r-- | crawl-ref/source/dbg-scan.cc | 85 |
1 files changed, 40 insertions, 45 deletions
diff --git a/crawl-ref/source/dbg-scan.cc b/crawl-ref/source/dbg-scan.cc index be73c10d1b..b35e651783 100644 --- a/crawl-ref/source/dbg-scan.cc +++ b/crawl-ref/source/dbg-scan.cc @@ -1080,53 +1080,48 @@ item_type::item_type(item_def &item) sub_type = item.sub_type; } +// This could be done without the macros in C++11, where std::vector has a +// constructor that takes an initializer list. +#define INIT_VEC(vec, ...) do \ + { \ + vector<string> &x = (vec); \ + static const char *const ary[] = { __VA_ARGS__ }; \ + x.insert(x.begin(), ary, ary + ARRAYSZ(ary)); \ + } while (0) + +#define ITEM_FIELDS(name, ...) INIT_VEC(item_fields[ITEM_ ## name], __VA_ARGS__) + static void _init_fields() { -#define SET_FIELDS(x, name, ...) \ - string name[] = { __VA_ARGS__ }; \ - x.insert(x.begin(), name, name + sizeof(name) / sizeof(string)) - - SET_FIELDS(item_fields[ITEM_SCROLLS], scrolls, - "Num", "NumPiles", "PileQuant"); - SET_FIELDS(item_fields[ITEM_POTIONS], potions, - "Num", "NumPiles", "PileQuant"); - SET_FIELDS(item_fields[ITEM_FOOD], food, - "Num", "NumPiles", "PileQuant", "TotalNormNutr", - "TotalCarnNutr", "TotalHerbNutr"); - SET_FIELDS(item_fields[ITEM_GOLD], gold, - "Num", "NumPiles", "PileQuant"); - SET_FIELDS(item_fields[ITEM_WANDS], wands, - "Num", "WandCharges"); - SET_FIELDS(item_fields[ITEM_WEAPONS], weapons, - "OrdNum", "ArteNum", "AllNum", "OrdEnch", - "ArteEnch", "AllEnch", "OrdNumCursed", - "ArteNumCursed", "AllNumCursed", "OrdNumBranded"); - SET_FIELDS(item_fields[ITEM_STAVES], staves, - "Num", "NumCursed"); - SET_FIELDS(item_fields[ITEM_ARMOUR], armour, - "OrdNum", "ArteNum", "AllNum", "OrdEnch", - "ArteEnch", "AllEnch", "OrdNumCursed", - "ArteNumCursed", "AllNumCursed", - "OrdNumBranded"); - SET_FIELDS(item_fields[ITEM_JEWELLERY], jewellery, - "OrdNum", "ArteNum", "AllNum", "OrdNumCursed", - "ArteNumCursed", "AllNumCursed", "OrdEnch", - "ArteEnch", "AllEnch"); - SET_FIELDS(item_fields[ITEM_RODS], rods, - "Num", "RodMana", "RodRecharge", "NumCursed"); - SET_FIELDS(item_fields[ITEM_MISSILES], missiles, - "Num", "NumBranded", "NumPiles", "PileQuant"); - SET_FIELDS(item_fields[ITEM_MISCELLANY], misc, - "Num", "MiscPlus"); - SET_FIELDS(item_fields[ITEM_DECKS], decks, - "PlainNum", "OrnateNum", "LegendaryNum", - "AllNum", "AllDeckCards"); - SET_FIELDS(item_fields[ITEM_BOOKS], books, "Num"); - SET_FIELDS(item_fields[ITEM_ARTEBOOKS], artebooks, "Num"); - SET_FIELDS(item_fields[ITEM_MANUALS], manuals, "Num"); - SET_FIELDS(monster_fields, monsters, "Num", "MonsHD", "MonsHP", - "MonsXP", "TotalXP", "MonsNumChunks", "TotalNormNutr", - "TotalGourmNutr"); + ITEM_FIELDS(SCROLLS, "Num", "NumPiles", "PileQuant"); + ITEM_FIELDS(POTIONS, "Num", "NumPiles", "PileQuant"); + ITEM_FIELDS(FOOD, "Num", "NumPiles", "PileQuant", "TotalNormNutr", + "TotalCarnNutr", "TotalHerbNutr"); + ITEM_FIELDS(GOLD, "Num", "NumPiles", "PileQuant"); + ITEM_FIELDS(WANDS, "Num", "WandCharges"); + ITEM_FIELDS(WEAPONS, "OrdNum", "ArteNum", "AllNum", "OrdEnch", + "ArteEnch", "AllEnch", "OrdNumCursed", + "ArteNumCursed", "AllNumCursed", "OrdNumBranded"); + ITEM_FIELDS(STAVES, "Num", "NumCursed"); + ITEM_FIELDS(ARMOUR, "OrdNum", "ArteNum", "AllNum", "OrdEnch", + "ArteEnch", "AllEnch", "OrdNumCursed", + "ArteNumCursed", "AllNumCursed", + "OrdNumBranded"); + ITEM_FIELDS(JEWELLERY, "OrdNum", "ArteNum", "AllNum", "OrdNumCursed", + "ArteNumCursed", "AllNumCursed", "OrdEnch", + "ArteEnch", "AllEnch"); + ITEM_FIELDS(RODS, "Num", "RodMana", "RodRecharge", "NumCursed"); + ITEM_FIELDS(MISSILES, "Num", "NumBranded", "NumPiles", "PileQuant"); + ITEM_FIELDS(MISCELLANY, "Num", "MiscPlus"); + ITEM_FIELDS(DECKS, "PlainNum", "OrnateNum", "LegendaryNum", + "AllNum", "AllDeckCards"); + ITEM_FIELDS(BOOKS, "Num"); + ITEM_FIELDS(ARTEBOOKS, "Num"); + ITEM_FIELDS(MANUALS, "Num"); + + INIT_VEC(monster_fields, "Num", "MonsHD", "MonsHP", "MonsXP", "TotalXP", + "MonsNumChunks", "TotalNormNutr", + "TotalGourmNutr"); } static void _init_stats() |