2 #include <msp/core/application.h>
3 #include <msp/core/getopt.h>
4 #include <msp/datafile/loader.h>
5 #include <msp/datafile/parser.h>
6 #include <msp/io/print.h>
11 class ShoppingList: public RegisteredApplication<ShoppingList>
14 class InventoryLoader: public DataFile::Loader
17 InventoryLoader(ShoppingList &);
21 void track(const string &, int);
24 class LayoutLoader: public DataFile::Loader
27 LayoutLoader(ShoppingList &);
31 void track(const string &);
34 map<string, unsigned> inventory;
35 map<string, unsigned> layout;
38 ShoppingList(int, char **);
41 void load_inventory(const string &);
42 void load_layout(const string &);
46 ShoppingList::ShoppingList(int argc, char **argv)
48 string inv_fn = "inventory";
50 getopt.add_option('i', "inventory", inv_fn, GetOpt::REQUIRED_ARG);
53 load_inventory(inv_fn);
54 load_layout(getopt.get_args().front());
57 int ShoppingList::main()
59 IO::print("// Need to get:\n");
60 for(map<string, unsigned>::iterator i=layout.begin(); i!=layout.end(); ++i)
62 map<string, unsigned>::iterator j=inventory.find(i->first);
63 if(j!=inventory.end())
65 if(j->second<i->second)
66 IO::print("track \"%s\" %d;\n", i->first, i->second-j->second);
69 IO::print("track \"%s\" %d;\n", i->first, i->second);
72 IO::print("// Pre-existing:\n");
73 for(map<string, unsigned>::iterator i=layout.begin(); i!=layout.end(); ++i)
75 map<string, unsigned>::iterator j=inventory.find(i->first);
76 if(j!=inventory.end())
77 IO::print("track \"%s\" %d;\n", i->first, min(i->second, j->second));
80 IO::print("// Unused:\n");
81 for(map<string, unsigned>::iterator i=inventory.begin(); i!=inventory.end(); ++i)
83 map<string, unsigned>::iterator j=layout.find(i->first);
86 if(j->second<i->second)
87 IO::print("track \"%s\" %d;\n", i->first, i->second-j->second);
90 IO::print("track \"%s\" %d;\n", i->first, i->second);
96 void ShoppingList::load_inventory(const string &fn)
99 DataFile::Parser parser(in, fn);
100 InventoryLoader il(*this);
104 void ShoppingList::load_layout(const string &fn)
107 DataFile::Parser parser(in, fn);
108 LayoutLoader ll(*this);
113 ShoppingList::InventoryLoader::InventoryLoader(ShoppingList &s):
116 add("track", &InventoryLoader::track);
119 void ShoppingList::InventoryLoader::track(const string &n, int count)
121 sl.inventory[n] += count;
125 ShoppingList::LayoutLoader::LayoutLoader(ShoppingList &s):
128 add("track", &LayoutLoader::track);
137 void ShoppingList::LayoutLoader::track(const string &n)