4 #include <msp/core/getopt.h>
5 #include <msp/parser/loader.h>
6 #include <msp/parser/parser.h>
14 ShoppingList(int, char **);
15 void print(ostream &);
17 class InventoryLoader: public Parser::Loader
20 InventoryLoader(ShoppingList &);
24 void track(unsigned, unsigned);
27 class LayoutLoader: public Parser::Loader
30 LayoutLoader(ShoppingList &);
37 typedef map<unsigned, unsigned> TrackMap;
42 void load_inventory(const string &);
43 void load_layout(const string &);
46 int main(int argc, char **argv)
48 ShoppingList sl(argc, argv);
53 ShoppingList::ShoppingList(int argc, char **argv)
55 string inv_fn="inventory";
57 getopt.add_option('i', "inventory", inv_fn, GetOpt::REQUIRED_ARG);
60 load_inventory(inv_fn);
61 load_layout(getopt.get_args().front());
64 void ShoppingList::load_inventory(const string &fn)
66 ifstream in(fn.c_str());
67 Parser::Parser parser(in, fn);
68 InventoryLoader il(*this);
72 void ShoppingList::load_layout(const string &fn)
74 ifstream in(fn.c_str());
75 Parser::Parser parser(in, fn);
76 LayoutLoader ll(*this);
80 void ShoppingList::print(ostream &out)
82 out<<"// Need to get:\n";
83 for(TrackMap::iterator i=layout.begin(); i!=layout.end(); ++i)
85 TrackMap::iterator j=inventory.find(i->first);
86 if(j!=inventory.end())
88 if(j->second<i->second)
89 out<<"track "<<i->first<<' '<<i->second-j->second<<";\n";
92 out<<"track "<<i->first<<' '<<i->second<<";\n";
95 out<<"// Pre-existing:\n";
96 for(TrackMap::iterator i=layout.begin(); i!=layout.end(); ++i)
98 TrackMap::iterator j=inventory.find(i->first);
99 if(j!=inventory.end())
100 out<<"track "<<i->first<<' '<<min(i->second,j->second)<<";\n";
104 for(TrackMap::iterator i=inventory.begin(); i!=inventory.end(); ++i)
106 TrackMap::iterator j=layout.find(i->first);
109 if(j->second<i->second)
110 out<<"track "<<i->first<<' '<<i->second-j->second<<";\n";
113 out<<"track "<<i->first<<' '<<i->second<<";\n";
117 ShoppingList::InventoryLoader::InventoryLoader(ShoppingList &s):
120 add("track", &InventoryLoader::track);
123 void ShoppingList::InventoryLoader::track(unsigned part, unsigned count)
125 sl.inventory[part]+=count;
128 ShoppingList::LayoutLoader::LayoutLoader(ShoppingList &s):
131 add("track", &LayoutLoader::track);
135 void ShoppingList::LayoutLoader::track(unsigned part)