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 typedef map<unsigned, unsigned> TrackMap;
41 void load_inventory(const string &);
42 void load_layout(const string &);
45 int main(int argc, char **argv)
47 ShoppingList sl(argc, argv);
52 ShoppingList::ShoppingList(int argc, char **argv)
54 string inv_fn="inventory";
56 getopt.add_option('i', "inventory", inv_fn, GetOpt::REQUIRED_ARG);
59 load_inventory(inv_fn);
60 load_layout(getopt.get_args().front());
63 void ShoppingList::load_inventory(const string &fn)
66 DataFile::Parser parser(in, fn);
67 InventoryLoader il(*this);
71 void ShoppingList::load_layout(const string &fn)
74 DataFile::Parser parser(in, fn);
75 LayoutLoader ll(*this);
79 void ShoppingList::print(ostream &out)
81 out<<"// Need to get:\n";
82 for(TrackMap::iterator i=layout.begin(); i!=layout.end(); ++i)
84 TrackMap::iterator j=inventory.find(i->first);
85 if(j!=inventory.end())
87 if(j->second<i->second)
88 out<<"track "<<i->first<<' '<<i->second-j->second<<";\n";
91 out<<"track "<<i->first<<' '<<i->second<<";\n";
94 out<<"// Pre-existing:\n";
95 for(TrackMap::iterator i=layout.begin(); i!=layout.end(); ++i)
97 TrackMap::iterator j=inventory.find(i->first);
98 if(j!=inventory.end())
99 out<<"track "<<i->first<<' '<<min(i->second,j->second)<<";\n";
103 for(TrackMap::iterator i=inventory.begin(); i!=inventory.end(); ++i)
105 TrackMap::iterator j=layout.find(i->first);
108 if(j->second<i->second)
109 out<<"track "<<i->first<<' '<<i->second-j->second<<";\n";
112 out<<"track "<<i->first<<' '<<i->second<<";\n";
116 ShoppingList::InventoryLoader::InventoryLoader(ShoppingList &s):
119 add("track", &InventoryLoader::track);
122 void ShoppingList::InventoryLoader::track(unsigned part, unsigned count)
124 sl.inventory[part]+=count;
127 ShoppingList::LayoutLoader::LayoutLoader(ShoppingList &s):
130 add("track", &LayoutLoader::track);
134 void ShoppingList::LayoutLoader::track(unsigned part)