3 #include <msp/core/getopt.h>
4 #include <msp/datafile/loader.h>
5 #include <msp/datafile/parser.h>
13 ShoppingList(int, char **);
14 void print(ostream &);
16 class InventoryLoader: public DataFile::Loader
19 InventoryLoader(ShoppingList &);
23 void track(unsigned, unsigned);
26 class LayoutLoader: public DataFile::Loader
29 LayoutLoader(ShoppingList &);
36 map<unsigned, unsigned> inventory;
37 map<unsigned, unsigned> layout;
39 void load_inventory(const string &);
40 void load_layout(const string &);
43 int main(int argc, char **argv)
45 ShoppingList sl(argc, argv);
50 ShoppingList::ShoppingList(int argc, char **argv)
52 string inv_fn="inventory";
54 getopt.add_option('i', "inventory", inv_fn, GetOpt::REQUIRED_ARG);
57 load_inventory(inv_fn);
58 load_layout(getopt.get_args().front());
61 void ShoppingList::load_inventory(const string &fn)
64 DataFile::Parser parser(in, fn);
65 InventoryLoader il(*this);
69 void ShoppingList::load_layout(const string &fn)
72 DataFile::Parser parser(in, fn);
73 LayoutLoader ll(*this);
77 void ShoppingList::print(ostream &out)
79 out<<"// Need to get:\n";
80 for(map<unsigned, unsigned>::iterator i=layout.begin(); i!=layout.end(); ++i)
82 map<unsigned, unsigned>::iterator j=inventory.find(i->first);
83 if(j!=inventory.end())
85 if(j->second<i->second)
86 out<<"track "<<i->first<<' '<<i->second-j->second<<";\n";
89 out<<"track "<<i->first<<' '<<i->second<<";\n";
92 out<<"// Pre-existing:\n";
93 for(map<unsigned, unsigned>::iterator i=layout.begin(); i!=layout.end(); ++i)
95 map<unsigned, unsigned>::iterator j=inventory.find(i->first);
96 if(j!=inventory.end())
97 out<<"track "<<i->first<<' '<<min(i->second,j->second)<<";\n";
101 for(map<unsigned, unsigned>::iterator i=inventory.begin(); i!=inventory.end(); ++i)
103 map<unsigned, unsigned>::iterator j=layout.find(i->first);
106 if(j->second<i->second)
107 out<<"track "<<i->first<<' '<<i->second-j->second<<";\n";
110 out<<"track "<<i->first<<' '<<i->second<<";\n";
114 ShoppingList::InventoryLoader::InventoryLoader(ShoppingList &s):
117 add("track", &InventoryLoader::track);
120 void ShoppingList::InventoryLoader::track(unsigned part, unsigned count)
122 sl.inventory[part]+=count;
125 ShoppingList::LayoutLoader::LayoutLoader(ShoppingList &s):
128 add("track", &LayoutLoader::track);
132 void ShoppingList::LayoutLoader::track(unsigned part)