]> git.tdb.fi Git - r2c2.git/blob - source/shoppinglist/main.cpp
Initial revision
[r2c2.git] / source / shoppinglist / main.cpp
1 #include <fstream>
2 #include <iostream>
3 #include <map>
4 #include <msp/core/getopt.h>
5 #include <msp/parser/loader.h>
6 #include <msp/parser/parser.h>
7
8 using namespace std;
9 using namespace Msp;
10
11 class ShoppingList
12 {
13 public:
14         ShoppingList(int, char **);
15         void print(ostream &);
16 private:
17         class InventoryLoader: public Parser::Loader
18         {
19         public:
20                 InventoryLoader(ShoppingList &);
21         private:
22                 ShoppingList &sl;
23
24                 void track(unsigned, unsigned);
25         };
26
27         class LayoutLoader: public Parser::Loader
28         {
29         public:
30                 LayoutLoader(ShoppingList &);
31         private:
32                 ShoppingList &sl;
33
34                 void track(unsigned);
35         };
36
37         typedef map<unsigned, unsigned> TrackMap;
38
39         TrackMap inventory;
40         TrackMap layout;
41
42         void load_inventory(const string &);
43         void load_layout(const string &);
44 };
45
46 int main(int argc, char **argv)
47 {
48         ShoppingList sl(argc, argv);
49         sl.print(cout);
50         return 0;
51 }
52
53 ShoppingList::ShoppingList(int argc, char **argv)
54 {
55         string inv_fn="inventory";
56         GetOpt getopt;
57         getopt.add_option('i', "inventory", inv_fn, GetOpt::REQUIRED_ARG);
58         getopt(argc,argv);
59
60         load_inventory(inv_fn);
61         load_layout(getopt.get_args().front());
62 }
63
64 void ShoppingList::load_inventory(const string &fn)
65 {
66         ifstream in(fn.c_str());
67         Parser::Parser parser(in, fn);
68         InventoryLoader il(*this);
69         il.load(parser);
70 }
71
72 void ShoppingList::load_layout(const string &fn)
73 {
74         ifstream in(fn.c_str());
75         Parser::Parser parser(in, fn);
76         LayoutLoader ll(*this);
77         ll.load(parser);
78 }
79
80 void ShoppingList::print(ostream &out)
81 {
82         out<<"// Need to get:\n";
83         for(TrackMap::iterator i=layout.begin(); i!=layout.end(); ++i)
84         {
85                 TrackMap::iterator j=inventory.find(i->first);
86                 if(j!=inventory.end())
87                 {
88                         if(j->second<i->second)
89                                 out<<"track "<<i->first<<' '<<i->second-j->second<<";\n";
90                 }
91                 else
92                         out<<"track "<<i->first<<' '<<i->second<<";\n";
93         }
94
95         out<<"// Pre-existing:\n";
96         for(TrackMap::iterator i=layout.begin(); i!=layout.end(); ++i)
97         {
98                 TrackMap::iterator j=inventory.find(i->first);
99                 if(j!=inventory.end())
100                         out<<"track "<<i->first<<' '<<min(i->second,j->second)<<";\n";
101         }
102
103         out<<"// Unused:\n";
104         for(TrackMap::iterator i=inventory.begin(); i!=inventory.end(); ++i)
105         {
106                 TrackMap::iterator j=layout.find(i->first);
107                 if(j!=layout.end())
108                 {
109                         if(j->second<i->second)
110                                 out<<"track "<<i->first<<' '<<i->second-j->second<<";\n";
111                 }
112                 else
113                         out<<"track "<<i->first<<' '<<i->second<<";\n";
114         }
115 }
116
117 ShoppingList::InventoryLoader::InventoryLoader(ShoppingList &s):
118         sl(s)
119 {
120         add("track", &InventoryLoader::track);
121 }
122
123 void ShoppingList::InventoryLoader::track(unsigned part, unsigned count)
124 {
125         sl.inventory[part]+=count;
126 }
127
128 ShoppingList::LayoutLoader::LayoutLoader(ShoppingList &s):
129         sl(s)
130 {
131         add("track", &LayoutLoader::track);
132         add("base");
133 }
134
135 void ShoppingList::LayoutLoader::track(unsigned part)
136 {
137         ++sl.layout[part];
138 }