]> git.tdb.fi Git - r2c2.git/blob - source/libmarklin/catalogue.cpp
3ab96a99ebbadb325f821c1c52e74ba083ee1ac0
[r2c2.git] / source / libmarklin / catalogue.cpp
1 #include <msp/core/refptr.h>
2 #include <msp/datafile/parser.h>
3 #include "catalogue.h"
4 #include "locotype.h"
5 #include "tracktype.h"
6
7 using namespace std;
8 using namespace Msp;
9
10 namespace Marklin {
11
12 Catalogue::~Catalogue()
13 {
14         for(map<unsigned, TrackType *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
15                 delete i->second;
16 }
17
18 TrackType &Catalogue::get_track(unsigned art_nr) const
19 {
20         map<unsigned, TrackType *>::const_iterator i=tracks.find(art_nr);
21         if(i==tracks.end())
22                 throw KeyError("Unknown track type");
23
24         return *i->second;
25 }
26
27 LocoType &Catalogue::get_locomotive(unsigned art_nr) const
28 {
29         map<unsigned, LocoType *>::const_iterator i=locos.find(art_nr);
30         if(i==locos.end())
31                 throw KeyError("Unknown locomotive type");
32
33         return *i->second;
34 }
35
36 void Catalogue::load(const string &fn)
37 {
38         IO::File in(fn.c_str());
39
40         DataFile::Parser parser(in, fn);
41         Loader loader(*this);
42         loader.load(parser);
43 }
44
45
46 Catalogue::Loader::Loader(Catalogue &c):
47         cat(c)
48 {
49         add("locomotive", &Loader::locomotive);
50         add("track", &Loader::track);
51 }
52
53 void Catalogue::Loader::locomotive(unsigned art_no)
54 {
55         map<unsigned, LocoType *>::iterator i=cat.locos.find(art_no);
56         if(i!=cat.locos.end())
57                 throw Exception("Duplicate locomotive number");
58
59         RefPtr<LocoType> loco=new LocoType(art_no);
60         load_sub(*loco);
61         unsigned art_nr=loco->get_article_number();
62         cat.locos[art_nr]=loco.release();
63 }
64
65 void Catalogue::Loader::track(unsigned art_no)
66 {
67         map<unsigned, TrackType *>::iterator i=cat.tracks.find(art_no);
68         if(i!=cat.tracks.end())
69                 throw Exception("Duplicate track number");
70
71         RefPtr<TrackType> trk=new TrackType(art_no);
72         load_sub(*trk);
73         unsigned art_nr=trk->get_article_number();
74         cat.tracks[art_nr]=trk.release();
75 }
76
77 } // namespace Marklin