]> git.tdb.fi Git - r2c2.git/blobdiff - source/shoppinglist/main.cpp
Export properly formatted track statements from shoppinglist
[r2c2.git] / source / shoppinglist / main.cpp
index a56326c937e16a58fc8e597f931ac0e891599238..4ebd956d824e7a73976fb3000e7c63094d44c7cb 100644 (file)
@@ -1,24 +1,17 @@
-/* $Id$
-
-This file is part of the MSP Märklin suite
-Copyright © 2006-2008 Mikkosoft Productions, Mikko Rasa
-Distributed under the GPL
-*/
-
-#include <iostream>
 #include <map>
+#include <msp/core/application.h>
 #include <msp/core/getopt.h>
 #include <msp/datafile/loader.h>
 #include <msp/datafile/parser.h>
+#include <msp/io/print.h>
+#include "libr2c2/articlenumber.h"
 
 using namespace std;
 using namespace Msp;
+using namespace R2C2;
 
-class ShoppingList
+class ShoppingList: public RegisteredApplication<ShoppingList>
 {
-public:
-       ShoppingList(int, char **);
-       void print(ostream &);
 private:
        class InventoryLoader: public DataFile::Loader
        {
@@ -27,7 +20,7 @@ private:
        private:
                ShoppingList &sl;
 
-               void track(unsigned, unsigned);
+               void track(ArticleNumber, int);
        };
 
        class LayoutLoader: public DataFile::Loader
@@ -37,107 +30,113 @@ private:
        private:
                ShoppingList &sl;
 
-               void track(unsigned);
+               void track(ArticleNumber);
        };
 
-       map<unsigned, unsigned> inventory;
-       map<unsigned, unsigned> layout;
+       map<ArticleNumber, unsigned> inventory;
+       map<ArticleNumber, 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)
-{
-       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);
-}
-
-void ShoppingList::print(ostream &out)
+int ShoppingList::main()
 {
-       out<<"// Need to get:\n";
-       for(map<unsigned, unsigned>::iterator i=layout.begin(); i!=layout.end(); ++i)
+       IO::print("// Need to get:\n");
+       for(map<ArticleNumber, unsigned>::iterator i=layout.begin(); i!=layout.end(); ++i)
        {
-               map<unsigned, unsigned>::iterator j=inventory.find(i->first);
+               map<ArticleNumber, 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 \\%d %d;\n", i->first, i->second-j->second);
                }
                else
-                       out<<"track "<<i->first<<' '<<i->second<<";\n";
+                       IO::print("track \\%d %d;\n", i->first, i->second);
        }
 
-       out<<"// Pre-existing:\n";
-       for(map<unsigned, unsigned>::iterator i=layout.begin(); i!=layout.end(); ++i)
+       IO::print("// Pre-existing:\n");
+       for(map<ArticleNumber, unsigned>::iterator i=layout.begin(); i!=layout.end(); ++i)
        {
-               map<unsigned, unsigned>::iterator j=inventory.find(i->first);
+               map<ArticleNumber, unsigned>::iterator j=inventory.find(i->first);
                if(j!=inventory.end())
-                       out<<"track "<<i->first<<' '<<min(i->second,j->second)<<";\n";
+                       IO::print("track \\%d %d;\n", i->first, min(i->second, j->second));
        }
 
-       out<<"// Unused:\n";
-       for(map<unsigned, unsigned>::iterator i=inventory.begin(); i!=inventory.end(); ++i)
+       IO::print("// Unused:\n");
+       for(map<ArticleNumber, unsigned>::iterator i=inventory.begin(); i!=inventory.end(); ++i)
        {
-               map<unsigned, unsigned>::iterator j=layout.find(i->first);
+               map<ArticleNumber, 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 \\%d %d;\n", i->first, i->second-j->second);
                }
                else
-                       out<<"track "<<i->first<<' '<<i->second<<";\n";
+                       IO::print("track \\%d %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(ArticleNumber art_nr, int count)
 {
-       sl.inventory[part]+=count;
+       sl.inventory[art_nr] += 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(ArticleNumber art_nr)
 {
-       ++sl.layout[part];
+       ++sl.layout[art_nr];
 }