]> git.tdb.fi Git - r2c2.git/blob - source/libmarklin/catalogue.cpp
cce5ef04ee564d3b2bd7f8b78278e89a0ccab3ff
[r2c2.git] / source / libmarklin / catalogue.cpp
1 /* $Id$
2
3 This file is part of the MSP Märklin suite
4 Copyright © 2006-2010  Mikkosoft Productions, Mikko Rasa
5 Distributed under the GPL
6 */
7
8 #include <msp/core/refptr.h>
9 #include <msp/datafile/parser.h>
10 #include "catalogue.h"
11 #include "locotype.h"
12 #include "tracktype.h"
13
14 using namespace std;
15 using namespace Msp;
16
17 namespace Marklin {
18
19 Catalogue::Catalogue():
20         scale(1),
21         gauge(1.524),
22         layout(*this)
23 { }
24
25 Catalogue::~Catalogue()
26 {
27         for(map<unsigned, TrackType *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
28                 delete i->second;
29         for(map<unsigned, LocoType *>::iterator i=locos.begin(); i!=locos.end(); ++i)
30                 delete i->second;
31 }
32
33 TrackType &Catalogue::get_track(unsigned art_nr) const
34 {
35         map<unsigned, TrackType *>::const_iterator i=tracks.find(art_nr);
36         if(i==tracks.end())
37                 throw KeyError("Unknown track type");
38
39         return *i->second;
40 }
41
42 LocoType &Catalogue::get_locomotive(unsigned art_nr) const
43 {
44         map<unsigned, LocoType *>::const_iterator i=locos.find(art_nr);
45         if(i==locos.end())
46                 throw KeyError("Unknown locomotive type");
47
48         return *i->second;
49 }
50
51
52 Catalogue::Loader::Loader(Catalogue &c):
53         DataFile::BasicLoader<Catalogue>(c)
54 {
55         add("ballast_profile", &Loader::ballast_profile);
56         add("gauge", &Loader::gauge);
57         add("layout", &Loader::layout);
58         add("locomotive", &Loader::locomotive);
59         add("rail_profile", &Loader::rail_profile);
60         add("scale", &Loader::scale);
61         add("track", &Loader::track);
62 }
63
64 void Catalogue::Loader::ballast_profile()
65 {
66         load_sub(obj.ballast_profile);
67 }
68
69 void Catalogue::Loader::gauge(float g)
70 {
71         obj.gauge = g/1000;
72 }
73
74 void Catalogue::Loader::layout()
75 {
76         load_sub(obj.layout);
77 }
78
79 void Catalogue::Loader::locomotive(unsigned art_nr)
80 {
81         if(obj.locos.count(art_nr))
82                 throw Exception("Duplicate locomotive number");
83
84         RefPtr<LocoType> loco = new LocoType(art_nr);
85         load_sub(*loco);
86         obj.locos[art_nr] = loco.release();
87 }
88
89 void Catalogue::Loader::rail_profile()
90 {
91         load_sub(obj.rail_profile);
92 }
93
94 void Catalogue::Loader::scale(float n, float d)
95 {
96         obj.scale = n/d;
97 }
98
99 void Catalogue::Loader::track(unsigned art_nr)
100 {
101         if(obj.tracks.count(art_nr))
102                 throw Exception("Duplicate track number");
103
104         RefPtr<TrackType> trk = new TrackType(art_nr);
105         load_sub(*trk);
106         obj.tracks[art_nr] = trk.release();
107 }
108
109 } // namespace Marklin