1 /*
2  *  The ManaPlus Client
3  *  Copyright (C) 2004-2009  The Mana World Development Team
4  *  Copyright (C) 2009-2010  The Mana Developers
5  *  Copyright (C) 2011-2019  The ManaPlus Developers
6  *  Copyright (C) 2019-2021  Andrei Karas
7  *
8  *  This file is part of The ManaPlus Client.
9  *
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License as published by
12  *  the Free Software Foundation; either version 2 of the License, or
13  *  any later version.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
22  */
23 
24 #ifndef RESOURCES_MAP_PROPERTIES_H
25 #define RESOURCES_MAP_PROPERTIES_H
26 
27 #include "localconsts.h"
28 
29 #include <map>
30 #include <sstream>
31 
32 /**
33  * A class holding a set of properties.
34  */
35 class Properties notfinal
36 {
37     public:
Properties()38         Properties() :
39             mProperties()
40         {
41         }
42 
A_DELETE_COPY(Properties)43         A_DELETE_COPY(Properties)
44 
45         /**
46          * Destructor.
47          */
48         virtual ~Properties()
49         { }
50 
51         /**
52          * Get a map property.
53          *
54          * @param name The name of the property.
55          * @param def  Default value, empty string by default.
56          * @return the value of the given property or the given default when it
57          *         doesn't exist.
58          */
getProperty(const std::string & name,const std::string & def)59         const std::string getProperty(const std::string &name,
60                                       const std::string &def)
61                                       const A_WARN_UNUSED
62         {
63             const PropertyMap::const_iterator i = mProperties.find(name);
64             return (i != mProperties.end()) ? i->second : def;
65         }
66 
67         /**
68          * Gets a map property as a float.
69          *
70          * @param name The name of the property.
71          * @param def  Default value, 0.0F by default.
72          * @return the value of the given property or the given default when it
73          *         doesn't exist.
74          */
getFloatProperty(const std::string & name,const float def)75         float getFloatProperty(const std::string &name,
76                                const float def) const A_WARN_UNUSED
77         {
78             const PropertyMap::const_iterator i = mProperties.find(name);
79             float ret = def;
80             if (i != mProperties.end())
81             {
82                 std::stringstream ss;
83                 ss.str(i->second);
84                 ss >> ret;
85             }
86             return ret;
87         }
88 
89         /**
90          * Gets a map property as a boolean.
91          *
92          * @param name The name of the property.
93          * @param def  Default value, false by default.
94          * @return the value of the given property or the given default when it
95          *         doesn't exist.
96          */
getBoolProperty(const std::string & name,const bool def)97         bool getBoolProperty(const std::string &name,
98                              const bool def) const A_WARN_UNUSED
99         {
100             const PropertyMap::const_iterator i = mProperties.find(name);
101             bool ret = def;
102             if (i != mProperties.end())
103             {
104                 if (i->second == "true")
105                     ret = true;
106                 if (i->second == "false")
107                     ret = false;
108             }
109             return ret;
110         }
111 
112         /**
113          * Returns whether a certain property is available.
114          *
115          * @param name The name of the property.
116          * @return <code>true</code> when a property is defined,
117          *         <code>false</code> otherwise.
118          */
hasProperty(const std::string & name)119         bool hasProperty(const std::string &name) const A_WARN_UNUSED
120         { return (mProperties.find(name) != mProperties.end()); }
121 
122         /**
123          * Set a map property.
124          *
125          * @param name  The name of the property.
126          * @param value The value of the property.
127          */
setProperty(const std::string & name,const std::string & value)128         void setProperty(const std::string &name, const std::string &value)
129         { mProperties[name] = value; }
130 
131 
132     private:
133         typedef std::map<std::string, std::string> PropertyMap;
134         PropertyMap mProperties;
135 };
136 
137 #endif  // RESOURCES_MAP_PROPERTIES_H
138