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