Mercurial > vba-clojure
view src/gtk/configfile.h @ 6:458a4f18f3cd
working on lua generation
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 03 Mar 2012 10:48:33 -0600 |
parents | f9f4f1b99eed |
children |
line wrap: on
line source
1 // -*- C++ -*-2 // VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator.3 // Copyright (C) 1999-2003 Forgotten4 // Copyright (C) 2004 Forgotten and the VBA development team6 // This program is free software; you can redistribute it and/or modify7 // it under the terms of the GNU General Public License as published by8 // the Free Software Foundation; either version 2, or(at your option)9 // any later version.10 //11 // This program is distributed in the hope that it will be useful,12 // but WITHOUT ANY WARRANTY; without even the implied warranty of13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the14 // GNU General Public License for more details.15 //16 // You should have received a copy of the GNU General Public License17 // along with this program; if not, write to the Free Software Foundation,18 // Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.20 #ifndef __VBA_CONFIGFILE_H__21 #define __VBA_CONFIGFILE_H__23 #include <list>24 #include <string>25 #include <sstream>26 #include <ostream>28 namespace VBA29 {30 namespace Config31 {33 class NotFound34 {35 public:36 virtual ~NotFound() {}38 protected:39 NotFound() {}40 };42 class SectionNotFound : public NotFound43 {44 public:45 SectionNotFound(const std::string & _rsName) :46 m_sName(_rsName)47 {48 }49 virtual ~SectionNotFound() {}51 inline std::string sGetName() const { return m_sName; }53 private:54 std::string m_sName;55 };57 class KeyNotFound : public NotFound58 {59 public:60 KeyNotFound(const std::string & _rsSection, const std::string & _rsKey) :61 m_sSection(_rsSection),62 m_sKey(_rsKey)63 {64 }65 virtual ~KeyNotFound() {}67 inline std::string sGetSection() const { return m_sSection; }68 inline std::string sGetKey() const { return m_sKey; }70 private:71 std::string m_sSection;72 std::string m_sKey;73 };75 class Line76 {77 public:78 Line(const std::string & _rsKey, const std::string & _rsValue);80 std::string m_sKey;81 std::string m_sValue;82 };84 class Section : private std::list<Line>85 {86 public:87 explicit Section(const std::string & _rsName);89 inline std::string sGetName() const { return m_sName; }91 bool bKeyExists(const std::string & _rsKey);92 void vSetKey(const std::string & _rsKey, const std::string & _rsValue);93 std::string sGetKey(const std::string & _rsKey) const;94 void vRemoveKey(const std::string & _rsKey);96 template<typename T>97 void vSetKey(const std::string & _rsKey, const T & _rValue);99 template<typename T>100 T oGetKey(const std::string & _rsKey) const;102 // read only103 typedef std::list<Line>::const_iterator const_iterator;104 inline const_iterator begin() const105 {106 return std::list<Line>::begin();107 }108 inline const_iterator end() const109 {110 return std::list<Line>::end();111 }113 private:114 inline iterator begin()115 {116 return std::list<Line>::begin();117 }118 inline iterator end()119 {120 return std::list<Line>::end();121 }123 std::string m_sName;124 };126 class File : private std::list<Section>127 {128 public:129 File();130 File(const std::string & _rsFile);131 virtual ~File();133 bool bSectionExists(const std::string & _rsName);134 Section * poAddSection(const std::string & _rsName);135 Section * poGetSection(const std::string & _rsName);136 void vRemoveSection(const std::string & _rsName);137 void vLoad(const std::string & _rsFile,138 bool _bAddSection = true,139 bool _bAddKey = true);140 void vSave(const std::string & _rsFile);141 void vClear();143 // read only144 typedef std::list<Section>::const_iterator const_iterator;145 inline const_iterator begin() const146 {147 return std::list<Section>::begin();148 }149 inline const_iterator end() const150 {151 return std::list<Section>::end();152 }154 private:155 inline iterator begin()156 {157 return std::list<Section>::begin();158 }159 inline iterator end()160 {161 return std::list<Section>::end();162 }163 };165 // debug166 std::ostream & operator<<(std::ostream & _roOut, const File & _roConfig);168 template<typename T>169 void Section::vSetKey(const std::string & _rsKey, const T & _rValue)170 {171 std::ostringstream oOut;172 oOut << _rValue;173 for (iterator it = begin(); it != end(); it++)174 {175 if (it->m_sKey == _rsKey)176 {177 it->m_sValue = oOut.str();178 return;179 }180 }181 push_back(Line(_rsKey, oOut.str()));182 }184 template<typename T>185 T Section::oGetKey(const std::string & _rsKey) const186 {187 T oValue;188 for (const_iterator it = begin(); it != end(); it++)189 {190 if (it->m_sKey == _rsKey)191 {192 std::istringstream oIn(it->m_sValue);193 oIn >> oValue;194 return oValue;195 }196 }197 throw KeyNotFound(m_sName, _rsKey);198 }200 } // namespace Config201 } // namespace VBA204 #endif // __VBA_CONFIGFILE_H__