]> git.tdb.fi Git - r2c2.git/blobdiff - source/shoppinglist/main.cpp
Convert Catalogue to a Collection
[r2c2.git] / source / shoppinglist / main.cpp
index a87e2f8cab7a817db5d78ed36b6ae0bade96fe00..276a4c7877d0f68ec68bc1302291c11995456216 100644 (file)
-#include <fstream>
-#include <iostream>
 #include <map>
+#include <msp/core/application.h>
 #include <msp/core/getopt.h>
-#include <msp/parser/loader.h>
-#include <msp/parser/parser.h>
+#include <msp/datafile/loader.h>
+#include <msp/datafile/parser.h>
+#include <msp/io/print.h>
 
 using namespace std;
 using namespace Msp;
 
-class ShoppingList
+class ShoppingList: public RegisteredApplication<ShoppingList>
 {
-public:
-       ShoppingList(int, char **);
-       void print(ostream &);
 private:
-       class InventoryLoader: public Parser::Loader
+       class InventoryLoader: public DataFile::Loader
        {
        public:
                InventoryLoader(ShoppingList &);
        private:
                ShoppingList &sl;
 
-               void track(unsigned, unsigned);
+               void track(const string &, int);
        };
 
-       class LayoutLoader: public Parser::Loader
+       class LayoutLoader: public DataFile::Loader
        {
        public:
                LayoutLoader(ShoppingList &);
        private:
                ShoppingList &sl;
 
-               void track(unsigned);
+               void track(const string &);
        };
 
-       typedef map<unsigned, unsigned> TrackMap;
-
-       TrackMap inventory;
-       TrackMap layout;
+       map<string, unsigned> inventory;
+       map<string, unsigned> layout;
 
+public:
+       ShoppingList(int, char **);
+       int main();
+private:
        void load_inventory(const string &);
        void load_layout(const string &);
 };
 
-int main(int argc, char **argv)
-{
-       ShoppingList sl(argc, argv);
-       sl.print(cout);
-       return 0;
-}
 
 ShoppingList::ShoppingList(int argc, char **argv)
 {
-       string inv_fn="inventory";
+       string inv_fn = "inventory";
        GetOpt getopt;
        getopt.add_option('i', "inventory", inv_fn, GetOpt::REQUIRED_ARG);
-       getopt(argc,argv);
+       getopt(argc, argv);
 
        load_inventory(inv_fn);
        load_layout(getopt.get_args().front());
 }
 
-void ShoppingList::load_inventory(const string &fn)
+int ShoppingList::main()
 {
-       ifstream in(fn.c_str());
-       Parser::Parser parser(in, fn);
-       InventoryLoader il(*this);
-       il.load(parser);
-}
-
-void ShoppingList::load_layout(const string &fn)
-{
-       ifstream in(fn.c_str());
-       Parser::Parser parser(in, fn);
-       LayoutLoader ll(*this);
-       ll.load(parser);
-}
-
-void ShoppingList::print(ostream &out)
-{
-       out<<"// Need to get:\n";
-       for(TrackMap::iterator i=layout.begin(); i!=layout.end(); ++i)
+       IO::print("// Need to get:\n");
+       for(map<string, unsigned>::iterator i=layout.begin(); i!=layout.end(); ++i)
        {
-               TrackMap::iterator j=inventory.find(i->first);
+               map<string, unsigned>::iterator j=inventory.find(i->first);
                if(j!=inventory.end())
                {
                        if(j->second<i->second)
-                               out<<"track "<<i->first<<' '<<i->second-j->second<<";\n";
+                               IO::print("track \"%s\" %d;\n", i->first, i->second-j->second);
                }
                else
-                       out<<"track "<<i->first<<' '<<i->second<<";\n";
+                       IO::print("track \"%s\" %d;\n", i->first, i->second);
        }
 
-       out<<"// Pre-existing:\n";
-       for(TrackMap::iterator i=layout.begin(); i!=layout.end(); ++i)
+       IO::print("// Pre-existing:\n");
+       for(map<string, unsigned>::iterator i=layout.begin(); i!=layout.end(); ++i)
        {
-               TrackMap::iterator j=inventory.find(i->first);
+               map<string, unsigned>::iterator j=inventory.find(i->first);
                if(j!=inventory.end())
-                       out<<"track "<<i->first<<' '<<min(i->second,j->second)<<";\n";
+                       IO::print("track \"%s\" %d;\n", i->first, min(i->second, j->second));
        }
 
-       out<<"// Unused:\n";
-       for(TrackMap::iterator i=inventory.begin(); i!=inventory.end(); ++i)
+       IO::print("// Unused:\n");
+       for(map<string, unsigned>::iterator i=inventory.begin(); i!=inventory.end(); ++i)
        {
-               TrackMap::iterator j=layout.find(i->first);
+               map<string, unsigned>::iterator j=layout.find(i->first);
                if(j!=layout.end())
                {
                        if(j->second<i->second)
-                               out<<"track "<<i->first<<' '<<i->second-j->second<<";\n";
+                               IO::print("track \"%s\" %d;\n", i->first, i->second-j->second);
                }
                else
-                       out<<"track "<<i->first<<' '<<i->second<<";\n";
+                       IO::print("track \"%s\" %d;\n", i->first, i->second);
        }
+
+       return 0;
+}
+
+void ShoppingList::load_inventory(const string &fn)
+{
+       IO::File in(fn);
+       DataFile::Parser parser(in, fn);
+       InventoryLoader il(*this);
+       il.load(parser);
 }
 
+void ShoppingList::load_layout(const string &fn)
+{
+       IO::File in(fn);
+       DataFile::Parser parser(in, fn);
+       LayoutLoader ll(*this);
+       ll.load(parser);
+}
+
+
 ShoppingList::InventoryLoader::InventoryLoader(ShoppingList &s):
        sl(s)
 {
        add("track", &InventoryLoader::track);
 }
 
-void ShoppingList::InventoryLoader::track(unsigned part, unsigned count)
+void ShoppingList::InventoryLoader::track(const string &n, int count)
 {
-       sl.inventory[part]+=count;
+       sl.inventory[n] += count;
 }
 
+
 ShoppingList::LayoutLoader::LayoutLoader(ShoppingList &s):
        sl(s)
 {
        add("track", &LayoutLoader::track);
        add("base");
+       add("beamgate");
+       add("route");
+       add("signal");
+       add("terrain");
+       add("zone");
 }
 
-void ShoppingList::LayoutLoader::track(unsigned part)
+void ShoppingList::LayoutLoader::track(const string &n)
 {
-       ++sl.layout[part];
+       ++sl.layout[n];
 }