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