inifile.hh
来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· HH 代码 · 共 212 行
HH
212 行
/* * Copyright (c) 2001, 2002, 2003, 2004, 2005 * The Regents of The University of Michigan * All Rights Reserved * * This code is part of the M5 simulator. * * Permission is granted to use, copy, create derivative works and * redistribute this software and such derivative works for any * purpose, so long as the copyright notice above, this grant of * permission, and the disclaimer below appear in all copies made; and * so long as the name of The University of Michigan is not used in * any advertising or publicity pertaining to the use or distribution * of this software without specific, written prior authorization. * * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE * UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND * WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER * EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE. THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE * LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, SPECIAL, INDIRECT, * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM * ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH * DAMAGES. * * Authors: Nathan L. Binkert * Steven K. Reinhardt */#ifndef __INIFILE_HH__#define __INIFILE_HH__#include <fstream>#include <list>#include <string>#include <vector>#include "base/hashmap.hh"/** * @file * Declaration of IniFile object. * @todo Change comments to match documentation style. */////// This class represents the contents of a ".ini" file.////// It's basically a two level lookup table: a set of named sections,/// where each section is a set of key/value pairs. Section names,/// keys, and values are all uninterpreted strings.///class IniFile{ protected: /// /// A single key/value pair. /// class Entry { std::string value; ///< The entry value. mutable bool referenced; ///< Has this entry been used? public: /// Constructor. Entry(const std::string &v) : value(v), referenced(false) { } /// Has this entry been used? bool isReferenced() { return referenced; } /// Fetch the value. const std::string &getValue() const; /// Set the value. void setValue(const std::string &v) { value = v; } /// Append the given string to the value. A space is inserted /// between the existing value and the new value. Since this /// operation is typically used with values that are /// space-separated lists of tokens, this keeps the tokens /// separate. void appendValue(const std::string &v) { value += " "; value += v; } }; /// /// A section. /// class Section { /// EntryTable type. Map of strings to Entry object pointers. typedef m5::hash_map<std::string, Entry *> EntryTable; EntryTable table; ///< Table of entries. mutable bool referenced; ///< Has this section been used? public: /// Constructor. Section() : table(), referenced(false) { } /// Has this section been used? bool isReferenced() { return referenced; } /// Add an entry to the table. If an entry with the same name /// already exists, the 'append' parameter is checked If true, /// the new value will be appended to the existing entry. If /// false, the new value will replace the existing entry. void addEntry(const std::string &entryName, const std::string &value, bool append); /// Add an entry to the table given a string assigment. /// Assignment should be of the form "param=value" or /// "param+=value" (for append). This funciton parses the /// assignment statment and calls addEntry(). /// @retval True for success, false if parse error. bool add(const std::string &assignment); /// Find the entry with the given name. /// @retval Pointer to the entry object, or NULL if none. Entry *findEntry(const std::string &entryName) const; /// Print the unreferenced entries in this section to cerr. /// Messages can be suppressed using "unref_section_ok" and /// "unref_entries_ok". /// @param sectionName Name of this section, for use in output message. /// @retval True if any entries were printed. bool printUnreferenced(const std::string §ionName); /// Print the contents of this section to cout (for debugging). void dump(const std::string §ionName); }; /// SectionTable type. Map of strings to Section object pointers. typedef m5::hash_map<std::string, Section *> SectionTable; protected: /// Hash of section names to Section object pointers. SectionTable table; /// Look up section with the given name, creating a new section if /// not found. /// @retval Pointer to section object. Section *addSection(const std::string §ionName); /// Look up section with the given name. /// @retval Pointer to section object, or NULL if not found. Section *findSection(const std::string §ionName) const; public: /// Constructor. IniFile(); /// Destructor. ~IniFile(); /// Load parameter settings from given istream. This is a helper /// function for load(string) and loadCPP(), which open a file /// and then pass it here. /// @retval True if successful, false if errors were encountered. bool load(std::istream &f); /// Load the specified file, passing it through the C preprocessor. /// Parameter settings found in the file will be merged with any /// already defined in this object. /// @param file The path of the file to load. /// @param cppFlags Vector of extra flags to pass to cpp. /// @retval True if successful, false if errors were encountered. bool loadCPP(const std::string &file, std::vector<char *> &cppFlags); /// Load the specified file. /// Parameter settings found in the file will be merged with any /// already defined in this object. /// @param file The path of the file to load. /// @retval True if successful, false if errors were encountered. bool load(const std::string &file); /// Take string of the form "<section>:<parameter>=<value>" or /// "<section>:<parameter>+=<value>" and add to database. /// @retval True if successful, false if parse error. bool add(const std::string &s); /// Find value corresponding to given section and entry names. /// Value is returned by reference in 'value' param. /// @retval True if found, false if not. bool find(const std::string §ion, const std::string &entry, std::string &value) const; /// Determine whether the named section exists in the .ini file. /// Note that the 'Section' class is (intentionally) not public, /// so all clients can do is get a bool that says whether there /// are any values in that section or not. /// @return True if the section exists. bool sectionExists(const std::string §ion) const; /// Print unreferenced entries in object. Iteratively calls /// printUnreferend() on all the constituent sections. bool printUnreferenced(); /// Dump contents to cout. For debugging. void dump();};#endif // __INIFILE_HH__
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?