propertiesfile.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2007 Tommi Maekitalo
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * As a special exception, you may use this file as part of a free
10  * software library without restriction. Specifically, if other files
11  * instantiate templates or use macros or inline functions from this
12  * file, or you compile this file and link it with other files to
13  * produce an executable, this file does not by itself cause the
14  * resulting executable to be covered by the GNU General Public
15  * License. This exception does not however invalidate any other
16  * reasons why the executable file might be covered by the GNU Library
17  * General Public License.
18  *
19  * This library is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22  * Lesser General Public License for more details.
23  *
24  * You should have received a copy of the GNU Lesser General Public
25  * License along with this library; if not, write to the Free Software
26  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27  */
28 
29 #ifndef CXXTOOLS_PROPERTIESFILE_H
30 #define CXXTOOLS_PROPERTIESFILE_H
31 
32 #include <string>
33 #include <cxxtools/string.h>
34 #include <map>
35 #include <iosfwd>
36 
37 namespace cxxtools
38 {
40  {
41  typedef std::map<String, String> ValuesType;
42  ValuesType values;
43 
44  public:
45  explicit PropertiesFile(const std::string& filename);
46  explicit PropertiesFile(std::istream& in);
47 
48  void setValue(const String& key, const String& value)
49  {
50  values[key] = value;
51  }
52 
53  void removeValue(const String& key)
54  {
55  values.erase(key);
56  }
57 
58  bool hasValue(const String& key) const
59  {
60  return values.find(key) != values.end();
61  }
62 
63  String getValue(const String& key, const String& def = String()) const
64  {
65  ValuesType::const_iterator it = values.find(key);
66  return it == values.end() ? def : it->second;
67  }
68 
69  template <typename OutputIterator>
70  void getKeys(OutputIterator oi) const
71  {
72  for (ValuesType::const_iterator it = values.begin(); it != values.end(); ++it)
73  {
74  *oi = it->first;
75  ++oi;
76  }
77  }
78 
79  template <typename OutputIterator>
80  void getKeys(const String& praefix, OutputIterator oi) const
81  {
82  for (ValuesType::const_iterator it = values.begin(); it != values.end(); ++it)
83  {
84  String key = it->first;
85  if (key.size() > praefix.size()
86  && key.at(praefix.size()) == L'.'
87  && key.compare(0, praefix.size(), praefix) == 0
88  && key.find(L'.', praefix.size() + 2) == String::npos)
89  {
90  *oi = key.substr(praefix.size() + 1);
91  ++oi;
92  }
93  }
94  }
95 
96  template <typename OutputIterator>
97  void getKeysLong(const String& praefix, OutputIterator oi) const
98  {
99  for (ValuesType::const_iterator it = values.begin(); it != values.end(); ++it)
100  {
101  String key = it->first;
102  if (key.size() > praefix.size()
103  && key.at(praefix.size()) == '.'
104  && key.compare(0, praefix.size(), praefix) == 0
105  && key.find('.', praefix.size() + 2) == String::npos)
106  {
107  *oi = key;
108  ++oi;
109  }
110  }
111  }
112 
113  };
114 
115 }
116 
117 #endif // CXXTOOLS_PROPERTIESFILE_H