1 /***************************************************************************
2 data.h
3 -------------------
4 Brewing data
5 -------------------
6 Copyright 2001-2008 David Johnson
7 All rights reserved.
8
9 Redistribution and use in source and binary forms, with or without
10 modification, are permitted provided that the following conditions are met:
11
12 1. Redistributions of source code must retain the above copyright notice,
13 this list of conditions and the following disclaimer.
14
15 2. Redistributions in binary form must reproduce the above copyright notice,
16 this list of conditions and the following disclaimer in the documentation
17 and/or other materials provided with the distribution.
18
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
20 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
23 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 POSSIBILITY OF SUCH DAMAGE.
30 ***************************************************************************/
31
32 #ifndef DATA_H
33 #define DATA_H
34
35 #include <QList>
36 #include <QString>
37
38 #include "configstate.h"
39 #include "grain.h"
40 #include "hop.h"
41 #include "misc.h"
42 #include "style.h"
43
44 class QDomElement;
45
46 struct UEntry {
47 // hop utilization table entry structure
48 unsigned time;
49 unsigned utilization;
50 };
51
52 class Data {
53 public:
54 friend class DatabaseTool;
55
56 ~Data();
57 static Data *instance();
58 void initialize(const ConfigState &state);
59
60 // load the data
61 bool loadData(const QString &filename, bool quiet=false);
62 // save the data
63 bool saveData(const QString &filename);
64
65 // get/set the default size volume
66 const Volume &defaultSize() const;
67 void setDefaultSize(const Volume &v);
68 // get/set the default style
69 const Style &defaultStyle() const;
70 void setDefaultStyle(const QString &s);
71 void setDefaultStyle(const Style &s);
72 // get/set default hop type
73 const QString &defaultHopType() const;
74 void setDefaultHopType(const QString &t);
75 // get/set the default grain units
76 const Unit &defaultGrainUnit() const;
77 void setDefaultGrainUnit(Unit &u);
78 // get/set the default hop units
79 const Unit &defaultHopUnit() const;
80 void setDefaultHopUnit(Unit &u);
81 // get/set the default misc units
82 const Unit &defaultMiscUnit() const;
83 void setDefaultMiscUnit(Unit &u);
84 // get/set the default temperature unit
85 const Unit &defaultTempUnit() const;
86 void setDefaultTempUnit(Unit &u);
87
88 // return stringlists of data
89 QStringList stylesList();
90 QStringList grainsList();
91 QStringList hopsList();
92 QStringList miscList();
93
94 // return given data
95 Style style(const QString &name);
96 Grain grain(const QString &name);
97 Hop hop(const QString &name);
98 Misc misc(const QString &name);
99
100 // does data exist
101 bool hasStyle(const QString &name);
102 bool hasGrain(const QString &name);
103 bool hasHop(const QString &name);
104 bool hasMisc(const QString &name);
105
106 // insert data
107 void insertStyle(const Style &style);
108 void insertGrain(const Grain &grain);
109 void insertHop(const Hop &hop);
110 void insertMisc(const Misc &misc);
111
112 // clear data
113 void clearStyles();
114 void clearGrains();
115 void clearHops();
116 void clearMiscs();
117
118 // get utilization based on time
119 double utilization(unsigned time);
120 // add entry to utilization table
121 void addUEntry(const UEntry &entry);
122 // efficiency
123 double efficiency();
124 void setEfficiency(double e);
125 // steep yield
126 double steepYield();
127 void setSteepYield(double y);
128 // set ibu calc method
129 bool tinseth();
130 void setTinseth(bool tinseth);
131 // set srm calc method
132 bool morey();
133 void setMorey(bool morey);
134
135 private:
136 Data();
137 Data(const Data&);
138 Data &operator=(const Data&);
139
140 private:
141 friend class DataReader;
142 friend class DataWriter;
143 static Data *instance_;
144
145 Volume defaultsize_;
146 Style defaultstyle_;
147 QString defaulthoptype_;
148 Unit *defaultgrainunit_;
149 Unit *defaulthopunit_;
150 Unit *defaultmiscunit_;
151 Unit *defaulttempunit_;
152
153 GrainMap grainmap_;
154 HopMap hopmap_;
155 MiscMap miscmap_;
156 StyleMap stylemap_;
157
158 QList<UEntry> utable_;
159 double steepyield_;
160 double efficiency_;
161 bool tinseth_;
162 bool morey_;
163 };
164
165 // Inlined Methods ///////////////////////////////////////////////////////////
166
defaultHopType()167 inline const QString &Data::defaultHopType() const { return defaulthoptype_; }
168
setDefaultHopType(const QString & t)169 inline void Data::setDefaultHopType(const QString &t) { defaulthoptype_ = t; }
170
defaultSize()171 inline const Volume &Data::defaultSize() const { return defaultsize_; }
172
setDefaultSize(const Volume & v)173 inline void Data::setDefaultSize(const Volume &v) { defaultsize_ = v; }
174
defaultStyle()175 inline const Style &Data::defaultStyle() const { return defaultstyle_; }
176
setDefaultStyle(const Style & s)177 inline void Data::setDefaultStyle(const Style &s) { defaultstyle_ = s; }
178
defaultGrainUnit()179 inline const Unit &Data::defaultGrainUnit() const { return *defaultgrainunit_; }
180
setDefaultGrainUnit(Unit & u)181 inline void Data::setDefaultGrainUnit(Unit &u) { defaultgrainunit_ = &u; }
182
defaultHopUnit()183 inline const Unit &Data::defaultHopUnit() const { return *defaulthopunit_; }
184
setDefaultHopUnit(Unit & u)185 inline void Data::setDefaultHopUnit(Unit &u) { defaulthopunit_ = &u; }
186
defaultMiscUnit()187 inline const Unit &Data::defaultMiscUnit() const { return *defaultmiscunit_; }
188
setDefaultMiscUnit(Unit & u)189 inline void Data::setDefaultMiscUnit(Unit &u) { defaultmiscunit_ = &u; }
190
defaultTempUnit()191 inline const Unit &Data::defaultTempUnit() const { return *defaulttempunit_; }
192
setDefaultTempUnit(Unit & u)193 inline void Data::setDefaultTempUnit(Unit &u) { defaulttempunit_ = &u; }
194
stylesList()195 inline QStringList Data::stylesList() { return stylemap_.keys(); }
196
grainsList()197 inline QStringList Data::grainsList() { return grainmap_.keys(); }
198
hopsList()199 inline QStringList Data::hopsList() { return hopmap_.keys(); }
200
miscList()201 inline QStringList Data::miscList() { return miscmap_.keys(); }
202
hasStyle(const QString & name)203 inline bool Data::hasStyle(const QString &name) { return stylemap_.contains(name); }
204
hasGrain(const QString & name)205 inline bool Data::hasGrain(const QString &name) { return grainmap_.contains(name); }
206
hasHop(const QString & name)207 inline bool Data::hasHop(const QString &name) { return hopmap_.contains(name); }
208
hasMisc(const QString & name)209 inline bool Data::hasMisc(const QString &name) { return miscmap_.contains(name); }
210
insertStyle(const Style & style)211 inline void Data::insertStyle(const Style &style)
212 { stylemap_.insert(style.name(), style); }
213
insertGrain(const Grain & grain)214 inline void Data::insertGrain(const Grain &grain)
215 { grainmap_.insert(grain.name(), grain); }
216
insertHop(const Hop & hop)217 inline void Data::insertHop(const Hop &hop)
218 { hopmap_.insert(hop.name(), hop); }
219
insertMisc(const Misc & misc)220 inline void Data::insertMisc(const Misc &misc)
221 { miscmap_.insert(misc.name(), misc); }
222
clearStyles()223 inline void Data::clearStyles() { stylemap_.clear(); }
224
clearGrains()225 inline void Data::clearGrains() { grainmap_.clear(); }
226
clearHops()227 inline void Data::clearHops() { hopmap_.clear(); }
228
clearMiscs()229 inline void Data::clearMiscs() { miscmap_.clear(); }
230
efficiency()231 inline double Data::efficiency() { return efficiency_; }
232
setEfficiency(double e)233 inline void Data::setEfficiency(double e) { efficiency_ = e; }
234
steepYield()235 inline double Data::steepYield() { return steepyield_; }
236
setSteepYield(double y)237 inline void Data::setSteepYield(double y) { steepyield_ = y; }
238
tinseth()239 inline bool Data::tinseth() { return tinseth_; }
240
setTinseth(bool tinseth)241 inline void Data::setTinseth(bool tinseth) { tinseth_ = tinseth; }
242
morey()243 inline bool Data::morey() { return morey_; }
244
setMorey(bool morey)245 inline void Data::setMorey(bool morey) { morey_ = morey; }
246
247 #endif // DATA_H
248