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